我目前正在从Tripadvisor网站上抓取餐厅评论,我正试图从这个page中检索餐厅链接。
我想在底部的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控制台看到的链接,我希望得到的回报是:
/餐厅_Review-g187791-d25107357-Reviews-ADESSO_Vineria_Bistrot-Rome_Lazio.html
2条答案
按热度按时间anhgbhbe1#
您在使用Scrapy时遇到的问题可能是由于TripAdvisor网站使用JavaScript加载数据源,而Scrapy默认情况下不支持JavaScript。因此,当您尝试使用
response.css
或response.xpath
获取链接时,Scrapy只能看到页面的初始状态,而不会加载加载的数据。要检查已加载的页面,请使用open_in_browser()函数,并在编写xpath或css选择器之前阅读列出所需数据的位置。
检查它:https://docs.scrapy.org/en/latest/topics/dynamic-content.htmlhttps://docs.scrapy.org/en/latest/topics/debug.html
如果在使用这个示例时遇到问题,那么可以调用
response.text
并检查响应页面的当前内容fruv7luv2#
我使用SIM建议的xpath表达式解决了我的问题:
//div[contains(@data-test,'_list_item')]//div/div/div/span/a[starts-with(@href,'/Restaurant_Review')]/@href