XPATH如果存在,则else无限循环

2024-09-27 00:12:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用XPATH和scrapy来抓取/解析一本书。它是HTML文件格式(本地)

一个典型的页面由一些文本内容和一些脚注组成。我只想要正文,而忽略脚注。如果XPath捕捉到上标脚注标记(如下图所示),则可以,但必须完全忽略脚注

<html>
<div class="page" id="pg446"><div class="pgcontent">
    <p class="rfdNormal0">Bunch of Text<span class="rfdFootnotenum"> (1) </span>Some Nested Text<span class="rfdFootnotenum"> (2) </span>Bunch of Text</p>
<p>Bunch of Text</p>
<p>Bunch of Text</p>
<p class="rfdLine">__________________</p>
<p class="rfdFootnote0">(1)
Footnote 1</p>
<p class="rfdFootnote0">(2)
Footnote 2</p>
</div>
<div class="pgnum">--page 446--</div></div>
</div><div class="page" id="pg447"><div class="pgcontent">
    <p class="rfdNormal0">Bunch of Text</p>
<p>Bunch of text</p>
<p>Some Text here <span class="rfdAlaem">(</span><span class="rfdAie">Nested Text</span><span class="rfdAlaem">)</span> Bunch of Text</p>
</div>
<div class="pgnum">--page 447--</div>
</div>
</html>

脚注从该标记后开始:

<p class="rfdLine">__________________</p>

因此,在这个标签之前的一切都将被捕获;在每一页上,后面的所有内容都将被忽略。然而,并非所有页面都有脚注,有些页面没有,比如447页

我尝试了以下XPATH表达式:

//div[@class="pgcontent"]//*[contains(@*, "rfdLine")]/preceding-sibling::*|//div[@class="pgcontent" and count(.//*[contains(@*, "rfdLine")])=0]/*

当我在chrome浏览器中测试它时,它似乎工作得很好;然而,当我尝试使用scrapy/python进行scrape/parse时,它经历了一个无限循环,输出文件变得越来越大

怎么了

更新

期望输出应为:;必须保留标签: 请注意,脚注被忽略

<p class="rfdNormal0">Bunch of Text<span class="rfdFootnotenum"> (1) </span>Some Nested Text<span class="rfdFootnotenum"> (2) </span>Bunch of Text</p>
<p>Bunch of Text</p>
<p>Bunch of Text</p>
<p class="rfdNormal0">Bunch of Text</p>
<p>Bunch of text</p>
<p>Some Text here <span class="rfdAlaem">(</span><span class="rfdAie">Nested Text</span><span class="rfdAlaem">)</span> Bunch of Text</p>

Tags: oftextdivpagesome页面classnested
1条回答
网友
1楼 · 发布于 2024-09-27 00:12:02

正如我所怀疑的,这个bug存在于python/scrapy代码中,与XPATH表达式无关,因此它通过了无限循环。 因为我在每个页面上循环,所以我必须放置.来表示xpath表达式是相对的

因此,我的上述表述:

//div[@class="pgcontent"]//*[contains(@*, "rfdLine")]/preceding-sibling::*|//div[@class="pgcontent" and count(.//*[contains(@*, "rfdLine")])=0]/*

变得简单:

.//div[@class="pgcontent"]//*[contains(@*, "rfdLine")]/preceding-sibling::*|.//div[@class="pgcontent" and count(.//*[contains(@*, "rfdLine")])=0]/*

相关问题 更多 >

    热门问题