无法使用lxml和xpath从html检索文本

时间:2017-05-07 16:19:57

标签: html python-2.7 xpath web-scraping lxml

我正在进行第二次房屋定价项目,所以我需要从中国最大的二手房交易平台之一获取信息。这是我的问题,页面上的信息和使用Chrome'inspect'功能的相应元素如下:

enter image description here

我的代码:

>>>from lxml import etree
>>>import requests
>>>url = 'http://bj.lianjia.com/chengjiao/101101498110.html'
>>>r = requests.get(url)
>>>xiaoqu_avg_price = tree.xpath('//[@id="resblockCardContainer"]/div/div/div[2]/div/div[1]/span/text()')
>>>xiaoqu_avg_price
[]

返回的空列表是不可取的(理想情况下应该是73648)。此外,我查看了它的HTML源代码,其中显示了:

enter image description here

那我该怎么做才能得到我想要的东西呢?什么是 resblockCard 意味着什么?感谢。

2 个答案:

答案 0 :(得分:1)

此网站与许多其他网站一样,使用ajax填充内容。如果你发出类似的请求,你可以用json格式获得所需的值。

import requests

url = 'http://bj.lianjia.com/chengjiao/resblock?hid=101101498110&rid=1111027378082'
# Get json response
response = requests.get(url).json()
print(response['data']['resblock']['unitPrice'])
# 73648

请注意请求网址中的两组数字。原始页面网址中的第一个组,您可以在原始网页来源script下的resblockId:'1111027378082'标记下找到第二个组。

答案 1 :(得分:0)

XPath查询无法正常工作,因为您是在服务器提供服务的情况下针对页面的源代码运行它,而不是在渲染的浏览器页面上查找。

对此的一个解决方案是将SeleniumPhantomJS或其他一些浏览器驱动程序结合使用,该驱动程序将在该页面上运行JavaScript并为您呈现。

from selenium import webdriver
from lxml import html

driver = webdriver.PhantomJS(executable_path="<path to>/phantomjs.exe")
driver.get('http://bj.lianjia.com/chengjiao/101101498110.html')
source = driver.page_source
driver.close()  # or quit() if there are no more pages to scrape

tree = html.fromstring(source)
price = tree.xpath('//div[@id="resblockCardContainer"]/div/div/div[2]/div/div[1]/span/text()')[0].strip()

上述内容会返回73648 元/㎡