由于' str'无法在utf-8转换后从BeautifulSoup对象中提取数据类型转换

时间:2016-03-27 07:43:29

标签: python encoding utf-8 beautifulsoup

我正在尝试使用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'编解码器不能对字符u' \ xa9'进行编码。在   位置16052:序数不在范围内(128)

为了解决这个问题,我进一步搜索并遇到了解决它的this回答。我基本上必须将编码设置为'utf=8',我做了。所以这里是修改后的代码(仅限最后2行):

soup = soup.prettify().encode('utf-8')
print (soup)

这很好用。当我尝试使用教程here中提到的soup.get_text()方法时,会出现问题。每当我soup.get_text()时,我都会收到错误:

  

属性错误:' str'对象没有属性' get_text'

我认为这是预料之中的,因为我将汤编码为“utf-8'并将其更改为str。我尝试在type(soup)转换之前和之后打印utf-8并按预期方式,在转换之前它是bs4.BeautifulSoup类的对象,然后是str

我该如何解决这个问题?我很确定我做错了什么,并且有一个正确的解决方法。不幸的是,我对Python不太熟悉,所以请耐心等待我

2 个答案:

答案 0 :(得分:1)

您不应丢弃原始soup对象。您可以在需要打印时调用soup.prettify().encode('utf-8')(或将其保存到其他变量中)。

答案 1 :(得分:1)

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")
html_code = soup.prettify().encode('utf-8')
text = soup.get_text().encode('utf-8')

print html_code
print "#################"
print text



# a = soup.find()
# l = []
# for i in a.next_elements:
#     l.append(i)