【问题标题】:BeautifulSoup isn't recognizing UTF-8 characters even after using "fromEncoding=UTF-8"BeautifulSoup 无法识别 UTF-8 字符,即使使用了“fromEncoding=UTF-8”
【发布时间】:2013-07-04 10:51:33
【问题描述】:

我编写了一个简单的脚本,它只获取一个网页并将其内容提取到一个标记化列表中。但是,我遇到了一个问题,当我将 BeautifulSoup 对象转换为字符串时,“、”等的 UTF-8 字符不会转换。相反,它们仍保持 unicode 格式。

我在创建 BeautifulSoup 对象时将源定义为 UTF-8,我什至尝试单独运行 unicode 转换,但没有任何效果。有人知道为什么会这样吗?

from urllib2 import urlopen
from bs4 import BeautifulSoup
import nltk, re, pprint

url = "http://www.bloomberg.com/news/print/2013-07-05/softbank-s-21-6-billion-bid-for-    sprint-approved-by-u-s-.html"
raw = urlopen(url).read()
soup = BeautifulSoup(raw, fromEncoding="UTF-8")
result = soup.find_all(id="story_content")
str_result = str(result)
notag = re.sub("<.*?>", " ", str_result)
output = nltk.word_tokenize(notag)
print(output)

【问题讨论】:

  • 哇,它实际上是这样拼写的。 'fromEncoding' 完全不会与 'formEncoding' 混淆。
  • 您可以复制并粘贴您认为无法转换的字符吗?字符 [“] 和 ['] 与 ["] 和 ['] 不同。您是否希望它们以某种方式自动转换?

标签: python utf-8 beautifulsoup nltk


【解决方案1】:

您遇到问题的字符不是" (U+0022) 和' (U+0027),而是大引号 (U+201C) 和 ( U+201D) 和 (U+2019)。首先将它们转换为直接版本,您应该会得到您期望的结果:

raw = urlopen(url).read()
original = raw.decode('utf-8')
replacement = original.replace('\u201c', '"').replace('\u201d', '"').replace('\u2019', "'")
soup = BeautifulSoup(replacement)  # Don't need fromEncoding if we're passing in Unicode

这应该使引号字符变成您期望的形式。

【讨论】:

  • 感谢您的帮助,我没有意识到他们是两个不同的角色。我尝试使用您的调整运行脚本,但它们仍然没有被替换。我什至尝试使用 replacement = original.replace(r"\u201c", '"').replace(r"\u201d", '"').replace(r"\u2019", "'") 搜索它们但这没有用。以下是“替代”输出中仍显示的内容:Clearwire\u2019s CEO 和总裁
  • 感谢您的帮助。得到它的工作,只需将替换代码修改为以下内容:replacement = original.replace(u'\u201c', '"').replace(u'\u201d', '"').replace(u'\ u2019', "'")
  • 哎呀,是的,我忘记了在 Python 2.x 中,默认情况下字符串文字不是 Unicode,您需要执行 u"foo" 才能获得 Unicode 字符串。正如您已经发现的那样,您需要在这些字符串文字前面添加u
  • 猜猜这表明在 Stack Overflow 注释框中而不是在 Python 解释器中编写代码的危险... :-)
猜你喜欢
  • 2016-07-12
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多