html - 如何在与 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> </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 配对,那就更好了。
解决方案
您可以使用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
推荐阅读
- python - 我们如何在使用 python 的滚动平均期间拒绝包含异常值的窗口?
- algorithm - Gnome 排序的优缺点是什么
- javascript - 在反应中将axios响应传递给子组件
- javascript - 根据元素中的特定关键字计算数组中的项目
- c# - 是否可以在图表中创建自定义 X 轴?
- c# - 为什么 TimeZoneInfo.IsValidTime() 会为 DateTimeKind.Local 提供意外结果?
- python - 有什么办法可以从桌面背景获取 RGB 信息?
- regex - 如何在 laravel 中验证波斯蛞蝓?
- flutter - 如何在 Flutter Web 中获取本地 IP
- android - FireBase Auth createUserWithEmailAndPassword().then() 不起作用