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

时间:2018-02-18 01:43:33

标签: python html xpath wikipedia movie

我目前正在制作一个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将它们放在一个列表中。我知道我可以将两个列表合并在一起,但电影必须按照它们在维基页面上显示的顺序。

主要问题来自带有@style和/ b的节点,它们都来自/ a。我尝试将它们组合在一起

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

但我只在列表的开头获得最近的获胜者(Moonlight),其余的名单只是提名的电影。

是否有可能将我的两个列表放在一个单独的声明中,或者我是否必须编写一个将电影放入正确的oder中的工作?

1 个答案:

答案 0 :(得分:1)

我会这样做:

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