2017-07-11 108 views
0

我正在嘗試爲TripAdvisor建立一個Python Scrapy蜘蛛,並試圖爲每個評論拉取泡沫/星級評分。我已經瀏覽了幾個在線教程,但它們看起來已經過時了,因爲泡泡圖片的標籤似乎已經發生了變化。Xpath:訪問嵌套@alt變量

目前,我正在嘗試根據TripAdvisor提供的HTML中每個氣泡評級的@alt變量文本。這是我想要的片段訪問:

<div class="rating reviewItemInline"> 
    <span class="ui_bubble_rating bubble_50"> 
    ::before 
    ::after 
    </span> 

的@alt變量位於即使它不會出現在出於某種原因Object Inspector中「ui_bubble_rating」類中。我可以通過使用XPath的訪問在Python:

response.xpath("//span[@class[contains(.,'ui_bubble_rating')]]/@alt") 

不過,我只是想拉從實際的評論@alt在頁面上(也有在同一頁共享上鍊接的其他酒店其他幾個泡沫的評分「 ui_bubble_rating「標籤)。所以,我試圖通過一定的專區內只選擇跨度類「ui_bubble_rating」縮小下來:

response.xpath("//div[@class[contains(., 'reviewItemInline')]]//span[@class[contains(.,'ui_bubble_rating')]]") 

此工程將它縮小到每個我想第5條的評論,但只要我釘在在「/ @ ALT」上面的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() 

我得到我需要的東西:評級列表(即: ['4.5分,共5分'5分,共5分'])

我懷疑它與我通過「//」或「/」或任何「/ */「等,但它可能與」:: before/:: after「行有關,以及我不確定這些函數的功能。我只是不熟悉XPath,找出爲什麼我不能提取這個值。

回答

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] 

後來又下了線,你可以分析這些類名來東西給你使用的情況下

+0

我不確定你是否完全正確地說'span class =「ui_bubble_rating」'沒有'@ alt'變量。當我編寫'response.xpath'(「// span [contains(@ class,'ui_bubble_rating')]/@ alt」)。extract()'我收到我需要的東西:'['4.5分, ,'5分,共5分',...]'。但是,如果它嵌套在'div class =「rating reviewItemInline」'中,我只想要'span class =「ui_bubble_rating」'。只要我將'(「// div [@ class ='rating reviewItemInline']'粘貼到'// span ...'xpath上面,我就會得到空列表'[]'。」 –

+0

我可能會誤解,但我理解你只想要用戶的收視率 –

+0

而且要添加,列表爲空,因爲就像我在我的答案中所述(代碼是從tripadvisor複製的) span標籤中沒有@alt屬性用於用戶評論 –

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)

+0

不幸的是更有用的,看來這些不輸出限制爲僅@alt在div類變量=」評級reviewItemInline「。它似乎忽略了這一部分,只是從整個頁面返回所有span class =「ui_bubble_rating」,而不僅僅是與實際用戶評論相關的部分。 –

+0

然後你需要更多的限制,你需要爲當前用戶唯一標識一個父項,你不能通過使用'div'和'span'這些類來解決它,你需要共享所有的html代碼段收視率。 – lauda