ValueError: Invalid \escape: 当在 Scrapy 中读取 json 作为响应时

Posted

技术标签:

【中文标题】ValueError: Invalid \\escape: 当在 Scrapy 中读取 json 作为响应时【英文标题】:ValueError: Invalid \escape: When readin json as respons in ScrapyValueError: Invalid \escape: 当在 Scrapy 中读取 json 作为响应时 【发布时间】:2017-08-18 12:25:45 【问题描述】:

在解析过程中,我得到带有 json 的文本对象响应。他们看起来都非常相似。其中一些工作没有任何错误。但其他人会抛出如下错误。

我尝试使用replace('\r\n', ''), strict=False. 无济于事。

这是我从中获取 json 的 URL - enter link description here 这是我的代码。 (第 51 行是data=json.loads

此外,当我在 scrapy shell 中尝试此 url 时,它打开为空并引发另一个错误 - 没有找到 json 文档。不知道这是否重要。

def parse_jsn(self, response):
        #inspect_response(response, self)

        data = json.loads(response.body_as_unicode())
        item = response.meta['item']
        item['text']= data[0]['bodyfull']
        yield item

这是错误代码。

ValueError: Invalid \escape: line 4 column 942 (char 945)
2017-03-25 17:21:19 [scrapy.core.scraper] ERROR: Spider error processing <GET
or.com/UserReviewController?a=mobile&r=434622632> (referer: https://www.tripa
w-g60763-d122005-Reviews-or490-The_New_Yorker_A_Wyndham_Hotel-New_York_City_N
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\scrapy\utils\defer.py", line 102, in it
    yield next(it)
  File "c:\python27\lib\site-packages\scrapy\spidermiddlewares\offsite.py", l
der_output
    for x in result:
  File "c:\python27\lib\site-packages\scrapy\spidermiddlewares\referer.py", l
    return (_set_referer(r) for r in result or ())
  File "c:\python27\lib\site-packages\scrapy\spidermiddlewares\urllength.py",

    return (r for r in result or () if _filter(r))
  File "c:\python27\lib\site-packages\scrapy\spidermiddlewares\depth.py", lin
    return (r for r in result or () if _filter(r))
  File "C:\Code\Active\tripadvisor\tripadvisor\spiders\mtripad.py", line 51,
    data = json.loads(response.body_as_unicode(), strict=False)
  File "c:\python27\lib\json\__init__.py", line 352, in loads
    return cls(encoding=encoding, **kw).decode(s)
  File "c:\python27\lib\json\decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\python27\lib\json\decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid \escape: line 4 column 579 (char 582)

【问题讨论】:

你确定 unicode 是正确的编码吗? @Explosion Pills 我不是。刚刚搜索了如何在 Scrapy 中处理 json。我有什么选择?我怎么知道正确的编码? 这能回答你的问题吗? Fixing invalid JSON escape 【参考方案1】:

首先,+1 用于抓取移动 API。比从 html 中抓取要聪明得多!

确实存在编码问题。有一些八进制编码字符 ([...] \074br/\076\074br/\076Best Regards,\074br/\076Emily [...]) 会破坏 JSON 解析。要摆脱它们,请使用:

response.body.decode('unicode-escape')

数据中还有一些编码的 HTML 字符:"&amp;#x201c;Nice clean and perfectly average&amp;#x201d;"。我建议取消它们:

from HTMLParser import HTMLParser
...
json.loads(HTMLParser().unescape(response.body.decode('unicode-escape'))
...

在 Python 3 中:

import html 
...
json.loads(html.unescape(response.body.decode('unicode-escape')))

结果应如下所示:['title': '“Nice clean and perfectly average”', 'bodyfull': '[...] stay. &lt;br/&gt;&lt;br/&gt;Best Regards,&lt;br/&gt;Emily Rodriguez", [...]]

如您所见,结果中有一些 HTML 标记。如果你想删除 HTML 标签,你可以使用 RegEx,如:

import re
...
p = re.compile(r'<.*?>')
no_html = p.sub('', str_html))

【讨论】:

以上是关于ValueError: Invalid \escape: 当在 Scrapy 中读取 json 作为响应时的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.load_weights() error: ValueError: Invalid high library version bound (invalid high libra

Python中ValueError: invalid literal for int() with base 10 的实用解决办法

继续获取 ValueError: invalid literal for int() with base 10: '1, 7'

如何为flask-socketio解决ValueError('Invalid async_mode specified')?

Python xlrd.open_workbook 生成错误:ValueError: invalid literal for int() with base 10: '

检查 IP 地址是不是真实 - 获取 ValueError: invalid literal for int() with base 10: '192.168.0.105'