2017-06-06 100 views
0

我從慾望網站獲取所有詳細信息,但無法獲取某些特定信息,請爲此指導我。無法從網站獲取列表值

targeted domain: https://shop.adidas.ae/en/messi-16-3-indoor-boots/BA9855.html

my code is response.xpath('//ul[@class="product-size"]//li/text()').extract()

enter image description here

need to fetch data!!!

enter image description here
謝謝!

+1

它從javascript加載。 – mkHun

+0

@mkHun請你給我**指導**完成任務。謝謝 –

+0

在查看頁面源碼檢查下面的JS變量'window.assets.sizesMap'。 – mkHun

回答

2

通常電子商務網站在頁面源代碼中使用json格式的數據,然後將javscript在用戶端解壓縮。

在這種情況下,您可以打開禁用JavaScript的頁面源代碼並搜索關鍵字(如特定大小)。

我在這種情況下,發現它可以使用正則表達式中找到:

import re 
import json 
data = re.findall('window.assets.sizesMap = (\{.+?\});', response.body_as_unicode()) 
json.loads(data[0]) 
Out: 
{'16': {'uk': '0k', 'us': '0.5'}, 
'17': {'uk': '1k', 'us': '1'}, 
'18': {'uk': '2k', 'us': '2.5'}, 
...} 

編輯:更準確地說,你可能想要得到的JSON的不同部分,但還是回答或多或少是相同的:

data = re.findall('window.assets.sizes = (\{(?:.|\n)+?\});', response.body_as_unicode()) 
json.loads(data[0].replace("'", '"')) # replace single quotes to doubles 
+0

我在應用您的代碼時遇到錯誤。 'IndexError Traceback(last recent call last) in () 1 data = re.findall('window.assets.sizes =(\ {。+?\});' ,response.body_as_unicode()) ----> 2 json.loads(data [0]。替換(「'」,''')) IndexError:列表索引超出範圍' –

+0

似乎你的正則表達式是不同的,我的是''window.assets.sizes =(\ {(?:。| \ n )+?\});''vs你的''window.assets.sizes =(\ {。+?\});''。 – Granitosaurus

+0

sir @Granitosaurus你能幫我解決飛濺問題嗎?機器來完成這個任務,我嘗試過但是不能完成它 –

1

您想要獲取的數據是從javascript中加載的。它在標籤class="js-size-value "中明確表示。

如果你想得到它,你將需要使用渲染服務。我建議你使用Splash,安裝簡單,使用簡單。你將需要碼頭安裝飛濺。

+0

雖然這是一個很好的懶惰選項,但它遠非必要。通過挖掘一下,你可以在scrapy中用python複製javascript。 – Granitosaurus

+0

是的,我同意。我會挖掘更多之前使用splash splash.Thanks的提示:-) –

+0

@Blanquer Adrien意味着可能使用scrapy獲得JavaScript基礎數據。 –