我正在尝试为TripAdvisor构建一个Python Scrapy蜘蛛,并试图为每个评论提取泡沫/星级评分。我已经浏览了几个在线教程,但由于气泡图像的标签似乎已经改变,它们似乎已经过时了。
目前,我试图根据来自TripAdvisor的HTML来为每个气泡评级提取@alt变量文本。以下是我要访问的代码段:
<div class="rating reviewItemInline">
<span class="ui_bubble_rating bubble_50">
::before
::after
</span>
@alt变量位于&#34; ui_bubble_rating&#34;即使它由于某种原因它没有出现在对象检查器中,也是如此。我可以使用以下命令通过Python中的xpath访问它:
response.xpath("//span[@class[contains(.,'ui_bubble_rating')]]/@alt")
但是,我只想从页面上的实际评论中拉出@alt(在同一页面上链接的其他酒店还有其他几个泡泡评级,共享&#34; ui_bubble_rating&#34;标记)。因此,我尝试通过仅选择span类&#34; ui_bubble_rating&#34;来缩小范围。在某个div内:
response.xpath("//div[@class[contains(., 'reviewItemInline')]]//span[@class[contains(.,'ui_bubble_rating')]]")
这可以将其缩小到我想要的每页5条评论,但只要我在&#39; / @ alt&#39;到上面的xpath结尾,我得到一个空白列表:
In [444]: response.xpath("//div[@class[contains(., 'reviewItemInline')]]//span[@class[contains(.,'ui_bubble_rating')]]/@alt")
Out[444]: []
如果我只删除xpath的前半部分:
//div[@class[contains(., 'reviewItemInline')]]
并保持这样:
response.xpath("//span[@class[contains(.,'ui_bubble_rating')]]/@alt").extract()
我得到了我需要的东西:一个评级列表(即[&#39; 4.5分,共5个泡泡,5个泡泡中的5个&#39;)
我怀疑这与我如何通过&#34; //&#34;访问相对路径有关。或&#34; /&#34;或者&#34; / * /&#34;等的任意组合,但它可能与&#34; ::之前的/ ::之后有关#34;线条以及我不确定这些功能如何。我不熟悉xpath,弄清楚为什么我无法提取这个值。
答案 0 :(得分:0)
使用此格式的选择器:
//span[contains(@class, 'ui_bubble_rating')]/@alt
这可以解决你的问题。
备选方案:
xpath://div[contains(@class, 'rating')]//span[contains(@class, 'ui_bubble_rating')]/@alt
css:.rating span[class*=ui_bubble_rating]::attr(alt)
答案 1 :(得分:0)
在要提取的实际元素中,没有alt属性:
<div class="rating reviewItemInline">
<span class="ui_bubble_rating bubble_40"></span>
</div>
所以你需要在课堂上(bubble_XX)得到它,这样的东西可以让你获得评分:
ratings = response.xpath("//div[contains(@class, 'reviewItemInline')]//span[contains(@class, 'ui_bubble_rating')]/@class").extract()
ratings = [r.split()[-1] for r in ratings]
稍后你可以将这些类名解析成对你使用案例更有用的东西