【问题标题】:UnicodeEncodeError: handling special charactersUnicodeEncodeError:处理特殊字符
【发布时间】:2015-04-05 09:34:11
【问题描述】:

我正在尝试废弃一个网页。为了处理除 ASCII 以外的所有字符,我编写了这段代码。

    mydata = ''.join([i if ord(i) < 128 else ' ' for i in response.text])

并使用漂亮的汤 python 库对其进行进一步处理。现在这不处理网页上的一些特殊字符,如 [tick]、[star](此处无法显示图片)。 关于如何转义这些字符并用空格替换它们的任何线索。 现在我有这个错误

    UnicodeEncodeError: 'charmap' codec can't encode character '\u2713' in position 62: character maps to <undefined>

【问题讨论】:

  • 您不需要处理一些特殊字符。一直使用 unicode 字符串。
  • @Daniel 当我将其写入文件时,它会显示此错误。这就是我问这个问题的原因。如何将其格式化为可以写入文件的格式?
  • ideone.com/lwJ76U 这是代码@Daniel 的链接

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


【解决方案1】:
fp = open("output.txt","w")

为您提供一个打开的文件以使用默认编码写入文本,在您的情况下,默认编码是没有字符 (可能是 cp1252)的编码,因此会出现错误。使用支持它的编码打开文件,你会没事的:

fp = open('output.txt', 'w', encoding='utf-8')

还要注意:

print("result: "+ str(ele))

如果您的控制台不支持 Unicode,则可能会失败,而在 Windows 下可能不会。使用 print(ascii(...)) 获取 ASCII 安全表示以进行调试。

您尝试删除非 ASCII 字符失败的可能原因是您在 解析 HTML 之前删除它们,而不是从解析后获得的值中删除它们。所以文字 将被删除,但如果使用像 &amp;#x2713; 这样的字符引用,它将被单独留下,由 bs4 解析,并最终成为

(我很遗憾,对 Unicode 错误的默认反应似乎总是试图完全摆脱非 ASCII 字符,而不是修复代码以正确处理它们。)

您还以一种非常奇怪的方式提取文本,使用str() 获取标记,然后尝试挑选标签并删除它们。这是不可靠的——HTML 解析起来并不那么简单,这就是 BeautifulSoup 的原因——而且没有必要,因为您已经拥有一个非常好的 HTML 解析器,它可以为您提供元素中的纯文本 (get_text())。

【讨论】:

    【解决方案2】:

    始终最好以 Unicode 处理所有内容,并仅在存储或传输之前转换为任何特定编码。例如,

    s = u"嗨,привет, ciao"

    > s
    u'Hi, \u043f\u0440\u0438\u0432\u0435\u0442, ciao'
    
    > s.encode('ascii', 'ignore')
    'Hi, , ciao'
    
    > s.encode('ascii', 'replace')
    'Hi, ??????, ciao'
    

    如果您需要专门用空格替换非 ascii 字符,您可以编写并注册自己的转换错误处理程序,请参阅codecs.register_error()

    【讨论】:

      【解决方案3】:

      您的大部分代码都不是必需的。 request 已经为您进行了正确的解码,beautifulsoup 为您进行了文本提取,python 在写入文件时为您进行了正确的编码:

      import requests
      from bs4 import BeautifulSoup
      
      #keyterm = input("Enter a keyword to search:")
      URL = 'https://www.google.com/search?q=jaguar&num=30'
      #NO_OF_LINKS_TO_BE_EXTRACTED = 10
      print("Requesting data from %s" % URL)
      response = requests.get(URL)
      soup = BeautifulSoup(response.text)
      
      #print(soup.prettify())
      metaM = soup.findAll("span","st")
      #metaM = soup.find("div", { "class" : "f slp" })
      with open("output.txt", "w", encoding='utf8') as fp:
          for ele in metaM:
              print("result: %r" % ele)
              fp.write(ele.get_text().replace('\n', ' ') + '\n')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 2011-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        相关资源
        最近更新 更多