python:xpath从boxofficemojo.com返回空列表

时间:2016-01-20 05:48:39

标签: python xpath

我正在尝试使用下面的代码从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()')

1 个答案:

答案 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()

如果表格结构发生变化,这也不那么脆弱。