关于python:由于’str’类型转换,无法在utf-8转换后从BeautifulSoup对象中提取数据

Unable to extract data from BeautifulSoup object after utf-8 conversion due to 'str' typecasting

我正在尝试用python构建自己的web scraper。其中一个步骤涉及解析HTML页面,我使用的是BeautifulSoup,这是大多数教程中推荐的解析器。这是我的代码,它应该提取页面并打印出来:

1
2
3
4
5
6
7
8
9
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
position 16052: ordinal not in range(128)

为了解决这个问题,我在谷歌上搜索了更多,找到了解决这个问题的答案。我基本上必须将编码设置为我所设置的'utf=8'。下面是修改后的代码(仅限最后两行):

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

这个很好用。当我尝试使用本教程中提到的soup.get_text()方法时,问题就出现了。每当我执行soup.get_text()时,我都会得到一个错误:

AttributeError: 'str' object has no attribute 'get_text'

我认为这是意料之中的,因为我将汤编码为"utf-8",它将把汤改成一个str。我试着在utf-8转换前后打印type(soup),如所料,转换前是bs4.BeautifulSoup类的对象,转换后是str

我怎么解决这个问题?我很确定我做错了什么,有一个合适的方法来解决这个问题。不幸的是,我不太熟悉python,所以请耐心等待


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

你不应该丢弃你原来的soup物体。当需要打印(或保存到其他变量)时,可以调用soup.prettify().encode('utf-8')