我正在尝试使用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不太熟悉,所以请耐心等待我
答案 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)