【问题标题】:scrapy: dealing with special characters in urlscrapy:处理 url 中的特殊字符
【发布时间】:2017-10-20 00:23:26
【问题描述】:

我正在抓取一个包含 é 等特殊字符的 XML 站点地图,结果是

ERROR: Spider error processing <GET [URL with '%C3%A9' instead of 'é']>

如何让 Scrapy 保持原始 URL 不变,即其中包含特殊字符?

Scrapy==1.3.3

Python==3.5.2 (我需要坚持这些版本)

更新: 根据https://stackoverflow.com/a/17082272/6170115,我能够使用unquote 获得具有正确字符的URL:

示例用法:

>>> from urllib.parse import unquote
>>> unquote('ros%C3%A9')
'rosé'

我也尝试了我自己的没有safe_url_string 的请求子类,但我最终得到:

UnicodeEncodeError: 'ascii' codec can't encode character '\xf9' in position 25: ordinal not in range(128)

完整的追溯:

[scrapy.core.scraper] ERROR: Error downloading <GET [URL with characters like ù]>
Traceback (most recent call last):
  File "/usr/share/anaconda3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1384, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/twisted/python/failure.py", line 393, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/middleware.py", line 43, in process_request
defer.returnValue((yield download_func(request=request,spider=spider)))
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/utils/defer.py", line 45, in mustbe_deferred
result = f(*args, **kw)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/handlers/__init__.py", line 65, in download_request
return handler.download_request(request, spider)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/handlers/http11.py", line 61, in download_request
return agent.download_request(request)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/handlers/http11.py", line 260, in download_request
agent = self._get_agent(request, timeout)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/handlers/http11.py", line 241, in _get_agent
scheme = _parse(request.url)[0]
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/webclient.py", line 37, in _parse
return _parsed_url_args(parsed)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/webclient.py", line 19, in _parsed_url_args
path = b(path)
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/core/downloader/webclient.py", line 17, in <lambda>
b = lambda s: to_bytes(s, encoding='ascii')
  File "/usr/share/anaconda3/lib/python3.5/site-packages/scrapy/utils/python.py", line 120, in to_bytes
return text.encode(encoding, errors)
UnicodeEncodeError: 'ascii' codec can't encode character '\xf9' in position 25: ordinal not in range(128)

有什么建议吗?

【问题讨论】:

标签: python-3.x web-scraping scrapy


【解决方案1】:

在存储Requests URL 之前,我认为您不能像w3lib 库中的Scrapy uses safe_url_string 那样做到这一点。您将不得不以某种方式扭转这种情况。

【讨论】:

    【解决方案2】:

    您可以在网址前使用“r”字母: url = r'name of that url'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2014-11-24
      • 2012-11-14
      相关资源
      最近更新 更多