如何解决XPATH如果存在则其他-无限循环
我正在尝试使用XPATH抓取/解析一本书。它是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进行抓取/解析时,它将经历无限循环,并且输出文件越来越大。
怎么了?
更新
所需的输出应为;标签必须保留: 注意脚注被忽略了。
<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>
解决方法
我怀疑该错误在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]/*
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。