Xpath 意外的反斜杠问题
Xpath unexpected backslash problems
我正在尝试使用 scrapy 从 HTML 中提取一些 json 文件,我有两个问题,它们相互冲突。
其中一个是b运行dName问题,出现在这个网站上:http://us.asos.com/barneys-originals/barneys-faux-leather-biker-jacket/prd/7949149?clr=black&SearchQuery=barneys+faux+biker&pgesize=9&pge=0&totalstyles=9&gridsize=3&gridrow=1&gridcolumn=1
包含 json 文件的 HTML 元素的一部分如下所示:
<script type="text/javascript">
require(['Pages/FullProduct'], function (view) {
view('{"id":7949149,
"name":"Barneys Faux Leather Biker Jacket",
"brandName":"Barney\'s Originals"
}');
});
</script>
另一个是size的问题,出现在这个网站上:
http://us.asos.com/asos/asos-3-pack-smart-slim-belt-in-faux-leather-save/prd/7098512?clr=multi&cid=21809
包含 json 文件的 HTML 元素的一部分如下所示:
<script type="text/javascript">
require(['Pages/FullProduct'], function (view {
view('{"id":7098512,
"name":"ASOS 3 Pack Smart Slim Belt In Faux Leather SAVE",
"brandName":"ASOS"
"variants": [{
"variantId": 7098598,
"size": "S/M - W79-86cm",
"sizeId": 3810,
"colour": "Multi",
"colourCode": "MU1",
"isPrimary": true,
"sizeOrder": 2
}, {
"variantId": 7098522,
"size": "L/XXL - 36\" - 40\ " (91-102cm)",
"sizeId": 7589,
"colour": "Multi",
"colourCode": "MU1",
"isPrimary": true,
"sizeOrder": 5}]');
}]
}');
});
</script>
我使用了这个方法,除了包含“\”的文本外,效果很好:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
我 运行 上面的代码和我得到的文本带有意外的反斜杠。 xpath 方法添加了两个额外的“\"s to the text where it supposed to be only one "\”。它让我在加载 json 文件时出错。
对于 b运行dName 问题:
"Barney\'s Originals"
变为 "Barney\\'s Originals"
.
尺寸问题:
"L/XXL - 36\" - 40\ " (91-102cm)"
变为 "L/XXL - 36\\" - 40\\ " (91-102cm)"
然后我尝试使用 replace("\", "")
方法擦除多余的两个反斜杠:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',").replace("\\", "")
完成上述操作后,b运行dName 问题得到解决,但大小问题变为:
"L/XXL - 36" - 40" (91-102cm)"
再次加载 json 文件时出现错误,因为它认为前两个 "s a set and the second two " 是一个集合。我注意到原始 html 也不会通过 json 验证器,因为它无法识别“\\”。
然后我尝试 replace("\\", "\")
尺寸问题:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',").replace("\\", "\")
但是我得到了这个错误:
SyntaxError: EOL while scanning string literal
我的问题是:我怎样才能同时解决这两个相互矛盾的问题,并且得到引号前只有一个反斜杠的文本?
我想要的结果是:
"Barney\'s Originals" 为 b运行dName.
"L/XXL - 36\" - 40\" (91-102cm)" 尺码
在第二种情况下,下面对我来说很好用
>>> data = response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
>>>
>>> data_json = json.loads(re.sub(r'[\]+"', r'\"', data))
>>> data_json["variants"]
[{'variantId': 7098523, 'size': 'XXS/XS - W66-76cm', 'sizeId': 7588, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 1}, {'variantId': 7098598, 'size': 'S/M - W79-86cm', 'sizeId': 3810, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 2}, {'variantId': 7098522, 'size': 'L/XXL - 36" - 40" (91-102cm)', 'sizeId': 7589, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 5}]
>>> data_json["variants"][0]['size']
'XXS/XS - W66-76cm'
>>> data_json["variants"][1]['size']
'S/M - W79-86cm'
下面的第一种情况也适用于我
>>> data = response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
>>> data_cleaned = re.sub(r'[\]+"', r'\"', data)
>>> data_cleaned = re.sub(r"[\]+'", r"'", data_cleaned)
>>> data_json = json.loads(data_cleaned)
>>> data_json['brandName']
"Barney's Originals"
我正在尝试使用 scrapy 从 HTML 中提取一些 json 文件,我有两个问题,它们相互冲突。
其中一个是b运行dName问题,出现在这个网站上:http://us.asos.com/barneys-originals/barneys-faux-leather-biker-jacket/prd/7949149?clr=black&SearchQuery=barneys+faux+biker&pgesize=9&pge=0&totalstyles=9&gridsize=3&gridrow=1&gridcolumn=1
包含 json 文件的 HTML 元素的一部分如下所示:
<script type="text/javascript">
require(['Pages/FullProduct'], function (view) {
view('{"id":7949149,
"name":"Barneys Faux Leather Biker Jacket",
"brandName":"Barney\'s Originals"
}');
});
</script>
另一个是size的问题,出现在这个网站上: http://us.asos.com/asos/asos-3-pack-smart-slim-belt-in-faux-leather-save/prd/7098512?clr=multi&cid=21809
包含 json 文件的 HTML 元素的一部分如下所示:
<script type="text/javascript">
require(['Pages/FullProduct'], function (view {
view('{"id":7098512,
"name":"ASOS 3 Pack Smart Slim Belt In Faux Leather SAVE",
"brandName":"ASOS"
"variants": [{
"variantId": 7098598,
"size": "S/M - W79-86cm",
"sizeId": 3810,
"colour": "Multi",
"colourCode": "MU1",
"isPrimary": true,
"sizeOrder": 2
}, {
"variantId": 7098522,
"size": "L/XXL - 36\" - 40\ " (91-102cm)",
"sizeId": 7589,
"colour": "Multi",
"colourCode": "MU1",
"isPrimary": true,
"sizeOrder": 5}]');
}]
}');
});
</script>
我使用了这个方法,除了包含“\”的文本外,效果很好:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
我 运行 上面的代码和我得到的文本带有意外的反斜杠。 xpath 方法添加了两个额外的“\"s to the text where it supposed to be only one "\”。它让我在加载 json 文件时出错。
对于 b运行dName 问题:
"Barney\'s Originals"
变为 "Barney\\'s Originals"
.
尺寸问题:
"L/XXL - 36\" - 40\ " (91-102cm)"
变为 "L/XXL - 36\\" - 40\\ " (91-102cm)"
然后我尝试使用 replace("\", "")
方法擦除多余的两个反斜杠:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',").replace("\\", "")
完成上述操作后,b运行dName 问题得到解决,但大小问题变为:
"L/XXL - 36" - 40" (91-102cm)"
再次加载 json 文件时出现错误,因为它认为前两个 "s a set and the second two " 是一个集合。我注意到原始 html 也不会通过 json 验证器,因为它无法识别“\\”。
然后我尝试 replace("\\", "\")
尺寸问题:
response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',").replace("\\", "\")
但是我得到了这个错误:
SyntaxError: EOL while scanning string literal
我的问题是:我怎样才能同时解决这两个相互矛盾的问题,并且得到引号前只有一个反斜杠的文本?
我想要的结果是:
"Barney\'s Originals" 为 b运行dName.
"L/XXL - 36\" - 40\" (91-102cm)" 尺码
在第二种情况下,下面对我来说很好用
>>> data = response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
>>>
>>> data_json = json.loads(re.sub(r'[\]+"', r'\"', data))
>>> data_json["variants"]
[{'variantId': 7098523, 'size': 'XXS/XS - W66-76cm', 'sizeId': 7588, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 1}, {'variantId': 7098598, 'size': 'S/M - W79-86cm', 'sizeId': 3810, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 2}, {'variantId': 7098522, 'size': 'L/XXL - 36" - 40" (91-102cm)', 'sizeId': 7589, 'colour': 'Multi', 'colourCode': 'MU1', 'isPrimary': True, 'sizeOrder': 5}]
>>> data_json["variants"][0]['size']
'XXS/XS - W66-76cm'
>>> data_json["variants"][1]['size']
'S/M - W79-86cm'
下面的第一种情况也适用于我
>>> data = response.xpath('//script[contains(., "Pages/FullProduct")]/text()').re_first("view\('(\{.*\})',")
>>> data_cleaned = re.sub(r'[\]+"', r'\"', data)
>>> data_cleaned = re.sub(r"[\]+'", r"'", data_cleaned)
>>> data_json = json.loads(data_cleaned)
>>> data_json['brandName']
"Barney's Originals"