我目前正在制作一个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中的工作?
答案 0 :(得分:1)
我会这样做:
//table[@class="wikitable"]//tr/td[1][not(@rowspan)]//a
//table[@class="wikitable"]
仅选择包含电影的表格。//tr/td[1][not(@rowspan)]
选择每行的第一个字段,不包括仅列出年份的大字段。