【发布时间】:2016-07-14 16:34:11
【问题描述】:
我正在尝试使用 Python 构建自己的网络爬虫。其中一个步骤涉及解析 HTML 页面,为此我使用 BeautifulSoup,这是大多数教程中推荐的解析器。这是我应该提取页面并打印它的代码:
import urllib
from bs4 import BeautifulSoup
urlToRead = "http://www.randomjoke.com/topic/haha.php"
handle = urllib.urlopen(urlToRead)
htmlGunk = handle.read()
soup = BeautifulSoup(htmlGunk, "html.parser")
soup = soup.prettify()
print (soup)
但是,当我执行soup.prettify() 然后打印它时,似乎出现了错误。错误是:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in 位置 16052:序数不在范围内(128)
为了解决这个问题,我进一步搜索并遇到了this SO 的答案,它解决了这个问题。我基本上必须将编码设置为'utf=8',我这样做了。所以这里是修改后的代码(仅最后 2 行):
soup = soup.prettify().encode('utf-8')
print (soup)
这很好用。当我尝试使用教程here 中提到的soup.get_text() 方法时,就会出现问题。每当我执行soup.get_text() 时,都会出现错误:
AttributeError: 'str' 对象没有属性 'get_text'
我认为这是意料之中的,因为我将汤编码为“utf-8”,并将其更改为str。我尝试在utf-8 转换之前和之后打印type(soup),正如预期的那样,在转换之前它是bs4.BeautifulSoup 类的对象,之后是str。
我该如何解决这个问题?我很确定我做错了什么,并且有解决这个问题的正确方法。不幸的是,我对 Python 不太熟悉,所以请多多包涵
【问题讨论】:
-
如果您唯一的问题是无法正常工作
print,您可以在打印行上执行encode。 -
所以基本上是
print(soup.get_text().encode('utf-8'))? -
是的,为什么不呢?您无需替换您的
soup对象即可打印它。 -
只打印它或使用其他变量来保存它而不是汤
-
是的,那是因为
soup.prettify()返回unicode并且您丢失了原来的bs4.BeautifulSoup对象。此错误已在您的代码中。
标签: python encoding utf-8 beautifulsoup