Xpath:访问嵌套的@alt变量

时间:2017-07-11 18:48:03

标签: python xpath scrapy

我正在尝试为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,弄清楚为什么我无法提取这个值。

2 个答案:

答案 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]

稍后你可以将这些类名解析成对你使用案例更有用的东西