python - 如何使用extract_links()从编码为 'gb2312'的网页中获取url

标签 python scrapy codec

环境:python 2.7 操作系统:ubuntu

我想从网页中提取一些链接,并在 scrapy shell 中测试它 但我遇到 UnicodeError:

我的代码:

le = LinkExtractor()

le.extract_links(response)

错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xcc in position 39: invalid continuation byte

在这个网页源代码中,我发现它编码为“gb2312”,所以我尝试:

print response.body.decode('gb2312') 它可以打印所有html

但是当:

le.extract_links(response.body.decode('gb2312')), 

有错误:

AttributeError: 'unicode' object has no attribute 'text'

因为extract_links需要htmlresponse作为参数,但是response.body response.text返回'byte'和'Unicode'对象;

类型(响应)

结果:类“scrapy.http.response.html.HtmlResponse”

所以我不知道如何修复响应,并从中提取链接; 有没有办法指定返回的响应是'utf-8'而不是'gb2312'

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/scrapy/linkextractors/lxmlhtml.py", line 128, in extract_links
    links = self._extract_links(doc, response.url, response.encoding, base_url)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/linkextractors/__init__.py", line 109, in _extract_links
    return self.link_extractor._extract_links(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/linkextractors/lxmlhtml.py", line 76, in _extract_links
    return self._deduplicate_if_needed(links)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/linkextractors/lxmlhtml.py", line 91, in _deduplicate_if_needed
    return unique_list(links, key=self.link_key)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/python.py", line 78, in unique
    seenkey = key(item)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/linkextractors/lxmlhtml.py", line 43, in <lambda>
    keep_fragments=True)
  File "/usr/local/lib/python2.7/dist-packages/w3lib/url.py", line 433, in canonicalize_url
    parse_url(url), encoding=encoding)
  File "/usr/local/lib/python2.7/dist-packages/w3lib/url.py", line 510, in parse_url
    return urlparse(to_unicode(url, encoding))
  File "/usr/local/lib/python2.7/dist-packages/w3lib/util.py", line 27, in to_unicode
    return text.decode(encoding, errors)
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xcc in position 39: invalid continuation byte

最佳答案

我认为你应该能够像这样手动指定编码: response.replace(encoding='gb2312') 然后尝试将其传递给链接提取器。

编辑:所以看起来scrapy无法在链接处理链的某个地方指定url编码(我相信在执行重复数据删除时在w3lib.url.canonicalize_url处)。作为解决方法,您可以使用以下方法:

resp = response.replace(encoding='utf8', body=response.text.encode('utf8'))

关于python - 如何使用extract_links()从编码为 'gb2312'的网页中获取url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880685/

相关文章:

python - 我可以使用 pycurl/curl 设置低优先级上传请求以避免使用所有上游吗

python - 停止 Scrapy 抓取相同的 URL

python - 如何从 XPath 中的类属性获取标题(Python/scrapy)

python - 如何在scrapy中处理302重定向

python - matplotlib动画可以保存成什么格式?

iphone - iPhone 上的有损压缩格式为原始 PCM

python - 在 setuptools 中使用 console_scripts 时出现 ImportError

python - 如何将浮点列表的 2d np.array 转换为浮点的 2d np.array,将列表值堆叠到行

Python RGB 数组到 HSL 并返回

audio - 关于多媒体编解码器的概念(容器、格式、编解码器、复用器、解复用器)