xpath - 如何获取可能包含或不包含父节点的节点

xpath - How do I get a node that may or may not contain a parent node

我目前正在构建一个 Python 脚本,它将从 wikipedia page 中提取所有获得奥斯卡最佳影片提名的电影。我为获奖者和被提名者制作了两个不同的名单。

from lxml import etree
import requests
r = requests.get('https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture')
doc = etree.fromstring(r.text)
winners = doc.xpath('//tr[@style="background:#FAEB86"]/td/i/b/a')
nominees = doc.xpath('//tr/td/i/a')

如您所见,我关注的是最后一个节点,因为它同时包含电影名称。我能够为每个列表获取所有电影,但我想使用 xpath 将它们放在一个列表中。我知道我可以将两个列表合并在一起,但电影必须按照它们在 wiki 页面上出现的顺序排列。

主要问题来自带有@style 和/b 的节点,它们都位于/a 之前。我尝试将它们放在一行中

winners = doc.xpath('//tr[@style="background:#FAEB86" or not(@style="background:#FAEB86")]/td/i[b or not(b)]/a')

但我只在名单的开头获得了最近的获奖者(月光),名单的其余部分只是提名的电影。

是否可以将我的两个列表放在一个语句中,或者我是否必须编写一个解决方案来使电影按正确的顺序排列?

我会这样做:

//table[@class="wikitable"]//tr/td[1][not(@rowspan)]//a
  • //table[@class="wikitable"] 仅选择包含电影的表格。
  • //tr/td[1][not(@rowspan)] 选择每行的第一个字段,不包括仅列出年份的大字段。