Scrapy XPath - @href 返回意外值

问题描述 投票:0回答:1

我目前正在从 Tripadvisor 网络抓取餐厅评论,并尝试从此页面检索餐厅链接。

我想要底部 30 个餐厅页面的链接,但我只用其中一个进行一些测试。可以使用以下表达式检索列表中的第一个:

//div[@data-test='1_list_item']/div/div[2]/div[1]/div//a/@href

Scrapy 有一些意外的行为,以下 css 表达式应该足以检索所有链接,但返回一个空数组:

response.css('.b::attr(href)').extract()

许多 Xpath 表达式也是如此,并使用上面的表达式,如下所示:

response.xpath("//div[@data-test='1_list_item']/div/div[2]/div[1]/div//a/@href").get()

我得到以下链接作为回报:

/ShowUserReviews-g187791-d25107357-r916086825-ADESSO_Vineria_Bistrot-Rome_Lazio.html

我不知道这是从哪里来的,我在检查 chrome 控制台中看到的链接以及我期望得到的回报是:

/餐厅_评论-g187791-d25107357-评论-ADESSO_Vineria_Bistrot-Rome_Lazio.html

python http web-scraping xpath scrapy
1个回答
0
投票

您在使用Scrapy时遇到的问题可能是由于TripAdvisor网站使用JavaScript加载数据源,而Scrapy默认不支持JavaScript。因此,当您尝试使用

response.css
response.xpath
获取链接时,Scrapy 只能看到页面的初始状态,而不会加载已加载的数据。

要检查已加载的页面,请使用 open_in_browser() 函数并在编写 xpath 或 css 选择器之前读取列出所需数据的位置。

检查一下: https://docs.scrapy.org/en/latest/topics/dynamic-content.html https://docs.scrapy.org/en/latest/topics/debug.html

# import this util
from scrapy.utils.response import open_in_browser

# in spider class
... 
def parse_details(self, response):
    open_in_browser(response)
...

如果您在使用此示例时遇到问题,那么您可以调用

response.text
并检查响应页面的当前内容

© www.soinside.com 2019 - 2024. All rights reserved.