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"