0

所以我正在制作一个 python 项目,我决定在其中做一个超市比较的东西。我决定从现有的超市比较网站中获取价格。

我用这个网站学习: https ://docs.python-guide.org/scenarios/scrape/

首先,我试图从这个网站获取苹果的价格(在 Tesco):

http://www.mysupermarket.co.uk/tesco-price-comparison/Fruit/Tesco_Gala_Apple_Approx_160g.html

使用文档代码的编辑版本,即:

import requests
from lxml import html
page = requests.get('http://www.mysupermarket.co.uk/tesco-price-comparison/Fruit/Tesco_Gala_Apple_Approx_160g.html')
    tree = html.fromstring(page.content)
    price_tesco = tree.xpath('//*[@id="PriceWrp"]/div[2]/span')
    print(price_tesco)

我已经尝试了价格的 xpath 代码,但是当我打印价格时,它什么也不返回(一个空列表)

那么我将如何解决这个问题?

注意 - 我是 HTML Scraping 的新手,并且对 python 有基本的了解,但我决定有点挑战。

提前致谢。

4

3 回答 3

1

因为它是一个 javascript 渲染页面,所以使用requests_html和渲染,例如:

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('http://www.mysupermarket.co.uk/tesco-price- 
comparison/Fruit/Tesco_Gala_Apple_Approx_160g.html')
r.html.render()
price = r.html.xpath('//*[@id="PriceWrp"]/div[2]/span')[0]
print(price.text)
于 2018-10-12T14:01:08.130 回答
1

我无法查看有问题的网站(在防火墙后面),但您应该知道,现在很多网站都有使用 javascripts 等的动态内容,并且无法使用基本库正确抓取,我假设是如果您xpath确实是正确的但什么也没返回,那么这里的情况。

最好的办法是使用可以呈现和抓取这些类型的动态内容的库,例如seleniumRequests-HTML(我的偏好,因为它是无头的)。

于 2018-10-12T13:49:32.510 回答
0

可能这个网站是动态的,不会让你获得完整的 html 文件。在这种情况下,您可以使用“selenium”库,速度稍慢但总能解决您的问题。

于 2018-10-12T14:04:59.293 回答