【问题标题】:BeautifulSoup Prettify fails on copyright symbolBeautifulSoup Prettify 在版权符号上失败
【发布时间】:2012-07-12 12:12:34
【问题描述】:

我收到一个 Unicode 错误:UnicodeEncodeError: 'charmap' codec can't encode character u'\xa9' in position 822: character maps to <undefined>

这似乎是一个标准的版权符号,在 HTML 中是 &copy。我一直无法找到解决办法。我什至尝试了一个自定义函数来用空格替换副本,但同样的错误也失败了。

import sys
import pprint
import mechanize
import cookielib
from bs4 import BeautifulSoup
import html2text
import lxml

def MakePretty():

def ChangeCopy(S):
    return S.replace(chr(169)," ")
br = mechanize.Browser()

# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

# The site we will navigate into, handling its session
# Open the site
br.open('http://www.thesitewizard.com/faqs/copyright-symbol.shtml')
html = br.response().read()
soup = BeautifulSoup(html)
print soup.prettify()

if __name__ == '__main__':
    MakePretty()

如何通过版权符号美化?我在网上搜索了一个无济于事的解决方案(或者我可能不明白,因为我对 Python 和抓取还很陌生)。

感谢您的帮助。

【问题讨论】:

标签: python unicode beautifulsoup prettify


【解决方案1】:

我遇到了同样的问题。这可能对你有用:

print soup.prettify().encode('UTF-8')

【讨论】:

  • @sliders_alpha:我相信是因为(在 OP 的情况下),BeautifuSoup 猜错了页面的编码。见wiki.python.org/moin/UnicodeEncodeError
  • 韩文页面也有同样的问题。不知道为什么美汤默认不使用utf8...页面的charset也定义为utf8...
  • 5 年后,这个解决方案也让我陷入困境。 :)
  • 没有 "encode('UTF-8')" 确实对我有用.. 亲爱的重击
【解决方案2】:

页面http://www.thesitewizard.com/faqs/copyright-symbol.shtml 发送时未指定字符编码。页面本身在meta 标记中将编码指定为 ISO-8859-1,但仅在出现“©”字符之后。所以客户必须进行猜测,而猜测可能是错误的。如果客户端猜到UTF-8,那么它会看到A9位,这是UTF-8数据中的数据错误。

所以在读取数据时,您似乎需要设置编码(设置为 ISO-8859-1,或更安全地设置为 windows-1252)。这当然只是一个临时解决方案;一般来说,修复编码是没有意义的。

【讨论】:

  • 是的,我们说的是“©”;我已经在我的回答中解决了这个问题。
【解决方案3】:

您使用的是chr(),这在这里是错误的,因为它需要 ASCII,并且只能达到 127/0x7F(尽管流行的民间传说,ASCII 只是 7 位)。 0xA9 / © 是 Unicode,所以你应该改用unichr(169)

【讨论】:

    【解决方案4】:

    只是在格式化程序函数中更改为 unichr 不起作用。最终使用了 decode(formatter=blah) ,它确实返回了没有版权符号的未格式化的 html。保存该 html 并将其输入 prettify 以达到目的。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2013-07-09
      • 1970-01-01
      • 2022-12-26
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多