7

我需要使用 BeautifulSoup 从页面中获取所有文本。在 BeautifulSoup 的文档中,它表明您可以这样soup.get_text()做。当我尝试在 reddit.com 上执行此操作时,出现此错误:


UnicodeEncodeError in soup.py:16
  'cp932' codec can't encode character u'\xa0' in position 2262: illegal multibyte sequence

在我检查的大多数网站上,我都会遇到类似的错误。
我也遇到了类似的错误soup.prettify(),但我通过将其更改为soup.prettify('UTF-8'). 有没有什么办法解决这一问题?提前致谢!

更新 6 月 24 日
我发现了一些似乎对其他人有用的代码,但我仍然需要使用 UTF-8 而不是默认值。代码:


texts = soup.findAll(text=True)

   def visible(element):
      if element.parent.name in ['style', 'script', '[document]', 'head', 'title']:
         return False
      elif re.match('', str(element)): return False
      elif re.match('\n', str(element)): return False
      return True

   visible_texts = filter(visible, texts)

   print visible_texts

但是,错误是不同的。进步?


UnicodeEncodeError in soup.py:29
'ascii' codec can't encode character u'\xbb' in position 1: ordinal not in range
(128)
4

2 回答 2

1

soup.get_text() 返回一个 Unicode 字符串,这就是您收到错误的原因。

您可以通过多种方式解决此问题,包括在 shell 级别设置编码。

export PYTHONIOENCODING=UTF-8

您可以通过将其包含在脚本中来重新加载 sys 并设置编码。

if __name__ == "__main__":
  reload(sys)
  sys.setdefaultencoding("utf-8")

或者您可以在代码中将字符串编码为 utf-8。对于您的 reddit 问题,可以使用以下方法:

import urllib
from bs4 import BeautifulSoup

url = "https://www.reddit.com/r/python"
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# get text
text = soup.get_text()

print(text.encode('utf-8'))
于 2014-08-29T11:02:34.767 回答
0

如果您可能正在处理页面上的 unicode,则不能执行 str(text)。使用 unicode() 代替 str()。

于 2012-06-24T18:28:41.897 回答