首页 > 解决方案 > 如何在与 xpath 和 lxml 匹配的包含后找到 X 单元格的值

问题描述

我有一个包含多行的文档,该文档在第四个 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> &nbsp; </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 的多种变体,然后尝试使用以下或以下兄弟无济于事:

totals = tree.xpath("//tr/td[contains(., 'TOTAL')]/../following::td[4]/div/text()")

...但是我要么从 TOTAL 之后的下一个 TD 中获得一个不可破坏空间的数组,要么根本没有数据,要么在扩展为文本时为空的“元素”引用。在包含匹配后,如何正确获取现有 TR 中 td[4] 内的值?

我试图让每一次出现,而不仅仅是一次,以便标题和总计数组是 1:1 匹配。如果有办法进行 key=>value 配对,那就更好了。

标签: htmlxpathhtml-parsinglxml

解决方案


您可以使用following-sibling轴在同一父级中包含文本“TOTAL”td之后定位td,然后进一步过滤结果以仅td使用 predicate获得最后一个[last()],然后返回子级div/text()

query = "//tr/td[contains(., 'TOTAL')]/following-sibling::td[last()]/div/text()"
titles = tree.xpath(query)

xpathtester 演示:http ://www.xpathtester.com/xpath/5cf0aa473d030da66de1bec73bcb8795


推荐阅读