我正在进行第二次房屋定价项目,所以我需要从中国最大的二手房交易平台之一获取信息。这是我的问题,页面上的信息和使用Chrome'inspect'功能的相应元素如下:
我的代码:
>>>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源代码,其中显示了:
那我该怎么做才能得到我想要的东西呢?什么是 resblockCard 意味着什么?感谢。
答案 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查询无法正常工作,因为您是在服务器提供服务的情况下针对页面的源代码运行它,而不是在渲染的浏览器页面上查找。
对此的一个解决方案是将Selenium与PhantomJS或其他一些浏览器驱动程序结合使用,该驱动程序将在该页面上运行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 元/㎡
。