【问题标题】:Can't parse data from `th` tag along with `td` tag from different tables无法解析来自“th”标签的数据以及来自不同表的“td”标签
【发布时间】:2018-06-05 23:27:22
【问题描述】:

我使用xpath 在python 中编写了一个脚本来解析网页中的表格数据。执行后,它能够完美地解析表中的数据。我唯一无法修复的是解析table header,这意味着th 标签。如果我使用 css 选择器做同样的事情,我可以使用 .cssselect("th,td") 但如果是 xpath 我就卡住了。关于如何解析来自th 标签的数据的任何帮助也将不胜感激。

这是能够从不同表中获取所有内容的脚本,th 标签内的数据除外:

import requests
from lxml.html import fromstring

response = requests.get("https://fantasy.premierleague.com/player-list/")
tree = fromstring(response.text)
for row in tree.xpath("//*[@class='ism-table']//tr"):
    tab_d = row.xpath('.//td/text()')
    print(tab_d)

【问题讨论】:

  • 期望的输出是什么?您想从每个 tr 中获取 th 节点和 td 吗?
  • 提前向两位关心为我提供出色解决方案的 xpath 巨头道歉。很难选择一个解决方案而不是另一个解决方案。但是,我正在考虑将我第一个得到的答案作为我选择的答案。

标签: python python-3.x xpath web-scraping lxml


【解决方案1】:

我不确定我明白你的意思,但如果你想用单个 XPath 获取 thtd 节点,你可以尝试替换

tab_d = row.xpath('.//td/text()')

tab_d = row.xpath('.//*[name()=("th" or "td")]/text()')

【讨论】:

【解决方案2】:

改变

.//td/text()

.//*[self::td or self::th]/text()

也包括th 元素。

请注意,假设tdth 都是tr 上下文节点的直接子节点是合理的,因此您可以进一步简化您的XPath:

*[self::td or self::th]/text()

【讨论】:

  • 感谢 kjhughes 先生的解决方案。它也完美地做到了这一点。这是我第一次在任何 xpath 中遇到 self 这个术语。我不确定我自己会理解这种风格。 +1 为您提供有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 2016-02-26
  • 1970-01-01
  • 2020-04-23
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多