2017-06-06 102 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基础数据。 –