【问题标题】:how to deal with ® in url for urllib2.urlopen?如何处理 urllib2.urlopen 中的 ®?
【发布时间】:2014-12-24 06:33:35
【问题描述】:

我收到了一个网址:https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp®-75-desktop-virtualization-solutions;它来自 BeautifulSoup。

url=u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions'

我想再次反馈到 urllib2.urlopen。

import urllib2
source = urllib2.urlopen(url).read()

我得到的错误:

UnicodeEncodeError: 'gbk' codec can't encode character u'\xae' in position 43: illegal multibyte sequence

因此,我尝试了:

source = urllib2.urlopen(url.encode("utf-8")).read()

它有页面源,但它与原始网址不同。

originalUrl = 'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp®-75-desktop-virtualization-solutions'
originalSource = urllib2.urlopen(originalUrl).read()
originalSource == source

结果为假。有什么想法可以修复此网址吗?如何将 u'\xae' 转换成原来的®

【问题讨论】:

    标签: python urllib2 python-unicode urlopen


    【解决方案1】:

    URL 必须是有效的字节串,并且非 ASCII 码点编码正确。您需要编码为 UTF-8,然后 url 引用您的 URL 路径:

    import urllib
    import urllib2
    import urlparse
    
    originalUrl = u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions'
    parsed_link = urlparse.urlsplit(originalUrl.encode('utf8'))
    parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path))
    encoded_link = parsed_link.geturl()
    source = urllib2.urlopen(encoded_link).read()
    

    演示:

    >>> import urllib
    >>> import urllib2 
    >>> import urlparse
    >>> originalUrl = u'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp\xae-75-desktop-virtualization-solutions'
    >>> parsed_link = urlparse.urlsplit(originalUrl.encode('utf8'))
    >>> parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path))
    >>> encoded_link = parsed_link.geturl()
    >>> encoded_link
    'https://www.packtpub.com/virtualization-and-cloud/citrix-xenapp%C2%AE-75-desktop-virtualization-solutions'
    >>> source = urllib2.urlopen(encoded_link).read()
    >>> len(source)
    68758
    

    【讨论】:

    • 有没有其他简单的方法来处理整个 URL 而不仅仅是 URL.path?
    • 不确定你的意思;如果您尝试将 urllib.quote 应用于整个 URL,则会编码错误的内容(如冒号)。
    • @Martijin,谢谢。你已经回答了我的问题。只需使用 urllib.quote 对 URL.path 进行编码。
    • 这似乎不正确。我可以毫无问题地通过http://ru.wikipedia.org/wiki/Солнечная_система
    • @ivan_pozdeev:如果您使用的是 UTF8 编码的 bytestring 而不是 Unicode 字符串,它可能工作,具体取决于服务器。 Wikipedia 支持发送编码为 UTF-8 的 URL,而无需正确的 URL 引用。这超出了要求,您不能指望所有服务器都这样做。
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2012-08-18
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2010-10-14
    • 2013-04-07
    • 2023-03-18
    相关资源
    最近更新 更多