Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用xpath从脚本中提取数据?_Xpath_Scrapy_Command Line Interface - Fatal编程技术网

如何使用xpath从脚本中提取数据?

如何使用xpath从脚本中提取数据?,xpath,scrapy,command-line-interface,Xpath,Scrapy,Command Line Interface,刚开始学习刮片,对于我的测试项目,我试图使用 response.xpath('//script[contains("quantity")]/text()').extract() 这不管用。 帮助我了解从数量、类别、路径等属性检索数据的正确约定 <script> window.dataLayer = window.dataLayer || []; dataLayer.push({"event":"datalayer-initialized","regi

刚开始学习刮片,对于我的测试项目,我试图使用

response.xpath('//script[contains("quantity")]/text()').extract()
这不管用。 帮助我了解从数量、类别、路径等属性检索数据的正确约定

<script>
        window.dataLayer = window.dataLayer || [];
        dataLayer.push({"event":"datalayer-initialized","region":"India","account_type":"ecom","customer":{"id":""},"page_type":"Product","product":{"ffr":"csddfas","name":"tote bag by singh","materials":"100% polyester","specs":"Dimensions: 18.5\" x 6.75\"; 24L","color":null,"size":null,"upc":null,"new":false,"brand":null,"season":"HOLIDAY 2017","on_sale":false,"quantity":"158","original_price":100,"price":100,"category_path":
        ["Mens","Accessories","Backpacks \/ Bags"],"created":"2016-09-07","modified":"2018-02-12",
        "colors":["BLACK"],"sizes":["S","M","L","XS","XL","XXL"]}});
</script>

window.dataLayer=window.dataLayer | |[];
数据层推送({“事件”:“数据层初始化”,“区域”:“印度”,“帐户类型”:“ecom”,“客户”:{“id”:“},“页面类型”:“产品”,“产品”:{“ffr”:“csddfas”,“名称”:“辛格的手提包”,“材料”:“100%聚酯”,“规格”:“尺寸:18.5\”x 6.75\”;24L”,“颜色”:空,“尺寸”:空,“upc”:空,“新”:假,“品牌”:空,“季节”:“2017年假日”,“出售中”:false,“数量”:“158”,“原价”:100,“价格”:100,“类别路径”:
[“男士”、“配饰”、“背包\/包”],“创建”:“2016-09-07”,“修改”:“2018-02-12”,
“颜色”:[“黑色”],“尺寸”:[“S”、“M”、“L”、“XS”、“XL”、“XXL”]});

您正在使用
css
方法,并为其提供一个
Xpath

试一试

您需要一个正则表达式来提取JSON字符串

re.findall(r'(?<=dataLayer\.push\().*(?=\)\;)', your_script_tag_data, re.DOTALL)

re.findall(r'(?根据我的经验,仅通过Xpath无法获取数量、类别路径等,因为它们是Json格式的。Xpath可以获取XML数据中的信息

我假设您已经有了xml数据,请使用
python
data=yourXML.xpath(“//script//text()”)

现在,数据是一个包含所有信息的字符串。然后,您需要在dataLayer.push中获取字符串并将其转换为Json格式。使用Json,可以轻松获取您的信息。

Scrapy选择器支持正则表达式,它可以在这种情况下帮助您:

javascript = response.xpath('//script[contains("quantity")]/text()').extract_first()
json_string = re.search( r'dataLayer\.push\((.+?)\);', javascript, re.DOTALL ).group(1)

data = json.loads(json_string)
print( "Quantity: {0}".format(data["product"]["quantity"]) )
response.xpath('//script[contains(text(),"quantity")]/text()').re(r'"quantity":"(\d+)"')
(您需要更新xpath以收集脚本内容,因为您的脚本不够好)


另一种方法:您还可以使用正则表达式收集脚本上的json内容,将它们解析为json obj,并尽可能轻松地使用它!

先生,我只使用了xpath,这是一个拼写错误,现在更新了问题,使用xpath命令它仍然返回完整的数据层脚本。数据层脚本?请发布您的输出t在您的问题中,先生,返回了问题中提到的完整脚本。@Anshumana您将需要使用正则表达式,请查看我的更新答案OK,我对正则表达式知之甚少,因此您能否提供一个工作代码补丁,我可以从这个json字符串中提取某些数据。谢谢bud。我可以使用此代码从多个属性中提取任何数据但是还是这一个#数量?你能告诉我获取大小的正则表达式吗?你可以用你的模式替换我的
.re(r''quantity:“(\d+)”
(例如,我认为用
大小替换
数量
,…请根据你的需要参考!第一个命令在//script[contains]中给出了无效参数数量的错误(“数量”)]/text()。
javascript = response.xpath('//script[contains("quantity")]/text()').extract_first()
json_string = re.search( r'dataLayer\.push\((.+?)\);', javascript, re.DOTALL ).group(1)

data = json.loads(json_string)
print( "Quantity: {0}".format(data["product"]["quantity"]) )
response.xpath('//script[contains(text(),"quantity")]/text()').re(r'"quantity":"(\d+)"')