我正在尝试使用下面的代码从BoxOfficeMojo.com上的每个电影页面中抓取特定数据。不幸的是,xpath返回一个空列表。有些帖子建议从xpath中删除tbody,但这也会返回一个空列表。我使用相同的代码从烂番茄和IMBD中提取文本,xpath运行正常。有谁知道为什么会这样,以及如何解决这个问题?
from lxml import html
import requests
# Box Office Mojo Scrape
page = requests.get('http://www.boxofficemojo.com/movies/?page=main&id=ateam.htm')
tree = html.fromstring(page.text)
print tree.xpath('//*[@id="body"]/table[2]/tbody/tr/td/table[1]/tbody/tr/td[2]/table/tbody/tr/td/center/table/tbody/tr[1]/td/font/b/text()')
print tree.xpath('//*[@id="body"]/table[2]/tr/td/table[1]/tr/td[2]/table/tr/td/center/table/tr[1]/td/font/b/text()')
# Rotten Tomatoes Scrape
page2 = requests.get('http://www.rottentomatoes.com/m/star_wars_episode_vii_the_force_awakens/')
tree2 = html.fromstring(page2.text)
print tree2.xpath('//*[@id="scorePanel"]/div[2]/div[1]/a/div/div[2]/div[1]/span/text()')
# IMDB Scrape
page3 = requests.get('http://www.imdb.com/title/tt2488496/?ref_=nv_sr_1')
tree3 = html.fromstring(page3.text)
print tree3.xpath('//*[@id="overview-top"]/h1/span[1]/text()')
答案 0 :(得分:2)
包含所需信息的表嵌套在另一个表中,依此类推。因此,尝试获取//*[@id='body']/table[2]
不会起作用,因为该div中只有一个表(其他表嵌套在其中)。
您可以使用极其笨重的xpath表达式
来获取此信息//*[@id='body']/table/tr[2]/table/tr/td/table[1]/tr/td[2]/table/tr/td/center/table[1]/tr[1]/td/font/b/text()
请注意,所需信息包含在字体标记内的粗体标记内,文本 Domestic Total Gross:直接位于字体内。我会使用以下内容来获取该信息
//*[@id='body']//font[starts-with(normalize-space(.),'Domestic Total Gross:')]/b/text()
如果表格结构发生变化,这也不那么脆弱。