2015-10-13 157 views
2

我正在使用Scrapy進行屏幕抓取項目,並且遇到XPath問題。XPath不能用於屏幕抓取

我想從下面的圖像中獲得94,218,但我用過的XPath和CSS不起作用。

enter image description here 這是從這個頁面:https://fancy.com/things/280558613/I%27m-Fine-T-Shirt

我已經試過多次的XPath和CSS與Scrapy但一切都返回空白。

下面是一些例子:

response.xpath('/html/body/div[1]/div[1]/div[1]/aside/div[1]/div/div/a[2]/text()').extract() 

response.xpath('//*[@id="sidebar"]/div[1]/div/div/a[2]/text()').extract() 

response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "fancyd_list", " "))])'.extract() 

response.xpath(".//*[@id='sidebar']/div[1]/div/div/a[2]/text()") 

我試過螢火蟲,Firepath,Chrome瀏覽器開發工具和不同的插件,但沒有的XPath或CSS似乎工作..有人可以幫助?

實際網頁上的代碼是:

<a href="#" class="fancyd_list "/> 
    6 
</a> 

一些的XPath的工作,但他們不包含文本,所以它看起來是這樣的:<a href="#" class="fancyd_list "/></a>

我使用BeautifulSoup也試過,但它有同樣的問題:

print soup.find_all('a',class_='fancyd_list') 
[<a class="fancyd_list " href="#"></a>, <a class="fancyd_list " href="#"></a>] 

謝謝!

+0

這種類型的解析總是讓我瘋狂。使用'美麗的湯',我敢打賭這將是微不足道的。 – RobertB

+0

嘿謝謝@RobertB會給出一個破解,遠離它,因爲我聽到的表現並不是最好的 – bnussey

+0

嘿@RobertB只是試過BeautifulSoup並得到了同樣的問題 – bnussey

回答

3

這裏的問題是,所提供的URL將在下面帶有格式錯誤<a>標籤返回HTML:

<a href="#" class="fancyd_list "/> # Malformed HTML, <a> tag closes here 
    94,218 
</a> 

在這裏,第一行包含一個/之前關閉托架,其通過HTML標準指示完成<a>標籤。從Scrapy開始,<a>元素完成後,您無法獲取標籤之外的文本。

以前使用BeautifulSoup的建議在這裏可能是一個好主意,因爲它可以更好地處理格式錯誤的HTML 太多

另一種選擇,你可以有這樣的例子是解決自己的HTML,通過類似於:通過

new_body = re.sub(r'<a href="#" class="fancyd_list "/>', '<a href="#" class="fancyd_list ">', response.body) 
response = response.replace(body=new_body) 

然後,您將能夠從響應選擇

response.xpath("//div[@class='frm']/div[@class='figure-button']/a[contains(@class, 'fancyd_list')]/text()").extract() 

我使用「包含」的原因是因爲類名(對於我)在其名稱末尾出現空格,因此Scrapy的"a[@class='fancyd_list']"檢查將失敗,因爲"fancyd_list" != "fancyd_list "

+0

您先生是一個傳奇。謝謝! – bnussey

+0

我是一個Python/Scrapy初學者,它的迴歸: '\ n -1 \ n' 有沒有簡單的方法來提取1? – bnussey

+1

如果它返回一個列表,從列表中取出你想要的項目,並使用'.strip()'去除前導/尾隨空白。這應該讓你只有數字(作爲一個字符串)。 – Rejected