我正在尝试使用LXML从IMDB中获取前250个电影列表,但其返回的空列表可以告诉我我犯的错误是什么。
from lxml.html import parse
tree = parse('http://www.imdb.com/chart/top')
movies = tree.findall('.//table[2]//a')
电影列表为空[]
答案 0 :(得分:1)
我使用firepath在浏览器中测试时,你的XPath与链接页面中的任何元素都不对应("没有匹配的节点"被返回)。
这是一种对我有用的方法:
from lxml.html import parse
tree = parse('http://www.imdb.com/chart/top')
movies = tree.xpath("//table[contains(@class, 'chart')]//td[@class='titleColumn']/a/text()")
for movie in movies:
print movie
更好地使用 xpath()
方法,它提供对XPath 1.0表达式的完全支持。上面使用的XPath参数的简要说明如下:
//table[contains(@class, 'chart')]
:在HTML文档中的任意位置找到table
元素,class
属性包含文本"chart"
//td[@class='titleColumn']
:然后在上述td
内的任何位置找到table
元素,其中class
属性值等于"titleColumn"
/a/text()
:然后从这样的td
中找到子元素a
并返回其文本内容上述代码段输出的一部分:
The Shawshank Redemption
The Godfather
The Godfather: Part II
The Dark Knight
Pulp Fiction
.....
答案 1 :(得分:0)
我的猜测是你使用错误的XPath进行解析,使用 Firebug ,电影表的正确xpath为
/html/body/div[1]/div/div[4]/div[3]/div/div[1]/div/span/div/div/div[2]/table/tbody
这将返回一个包含所有电影数据的表格。
您需要更多处理来获取每部电影信息。
我还建议使用请求lib进行HTTP查询