我正在尝试使用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>
正如我所怀疑的,这个bug存在于python/scrapy代码中,与XPATH表达式无关,因此它通过了无限循环。 因为我在每个页面上循环,所以我必须放置
.
来表示xpath表达式是相对的因此,我的上述表述:
变得简单:
相关问题 更多 >
编程相关推荐