如何在与 xpath 和 lxml 匹配的包含后找到 X 单元格的值
Posted
技术标签:
【中文标题】如何在与 xpath 和 lxml 匹配的包含后找到 X 单元格的值【英文标题】:How do I find the value of X cells after a matched contains with xpath and lxml 【发布时间】:2019-03-10 11:27:45 【问题描述】:我有一个包含多行的文档,该文档在第四个 TD 元素中有一个值,我不知道如何检索。标签中没有什么独特的,所以我必须根据单词 TOTAL 进行匹配,然后从现有行中的第 4 个 TD 获取我需要的值。这是一个用于说明的 TR:
<TR>
<TD ALIGN="right" COLSPAN="30" bgcolor=d8caca><div class=small4>SECTION TOTAL</div></TD>
<TD ALIGN="right" COLSPAN="8" bgcolor=d8caca> </TD>
<TD ALIGN="right" COLSPAN="13" bgcolor=gold><div class=small4> 11.907531</div>
</TD>
<TD ALIGN="right" COLSPAN="13" bgcolor=gold><div class=small4> $773.10</div></TD>
</TR>
我想匹配单词“TOTAL”,然后在恰好三个单元格之后获取值,或者在本例中为 $773.10。
这成功地将每个“TOTAL”文本收集到一个数组中,没有问题:
titles = tree.xpath("//tr/td[contains(., 'TOTAL')]//text()")
但是,我无法获取最后一个元素中的值。我尝试了以下搜索 TOTAL 的多种变体,然后尝试使用 following 或 following-sibling 无济于事:
totals = tree.xpath("//tr/td[contains(., 'TOTAL')]/../following::td[4]/div/text()")
...但我要么从 TOTAL 之后的下一个 TD 中获得一个不可破坏空间的数组,要么根本没有数据,要么在扩展为文本时为空的“元素”引用。包含匹配后,如何正确获取现有 TR 中 td[4] 内的值?
我正在尝试获取每一次出现,而不仅仅是一次,以便标题和总计数组是 1:1 匹配。如果有办法进行 key=>value 配对那就更好了。
【问题讨论】:
【参考方案1】:您可以使用following-sibling
轴获取位于td
之后的td
,在同一父级中包含文本“TOTAL”,然后使用谓词@ 进一步过滤结果以仅获取此类td
中的最后一个987654326@,然后返回子div/text()
:
query = "//tr/td[contains(., 'TOTAL')]/following-sibling::td[last()]/div/text()"
titles = tree.xpath(query)
xpathtester 演示:http://www.xpathtester.com/xpath/5cf0aa473d030da66de1bec73bcb8795
【讨论】:
这行得通。我发誓我尝试了这种确切的方法但没有成功,所以我不确定当它不起作用时我做错了什么。谢谢。以上是关于如何在与 xpath 和 lxml 匹配的包含后找到 X 单元格的值的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法