尝试使用Beautiful Soup - Python提取html页面时出现'charmap'编解码器错误

时间:2017-05-15 11:42:52

标签: python beautifulsoup

当我尝试使用下面的代码加载任何页面时,它只抓取标签<“head”>而不是整个HTML等。

import requests
from bs4 import BeautifulSoup

page = requests.get('http://www.tushmedia.com/')
soup = BeautifulSoup(page.content, 'lxml-xml')
print(soup.prettify())

但是,如果我删除'xml'并离开soup = BeautifulSoup(page.content, 'lxml'),则会产生错误:

'charmap'编解码器无法对位置11051中的字符u'\ u2019'进行编码:字符映射到

这是因为当我删除“xml”部分时,它不会抓取xml并且不会生成输出,当它尝试抓取HTML时会生成此错误。我认为这是关于UTF-8编码问题,但任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

这是反直觉的,但

  • "lxml"是一个HTML解析器,而

  • "lxml-xml"是一个XML解析器

u'\u2019'是正确的引号字符(花哨,卷曲),在ASCII表中没有任何表示。

BeautifulSoup使用名为Unicode, Dammit的子库来检测文档的编码并将其转换为Unicode。自动检测到的编码可用作.original_encoding对象的BeautifulSoup属性。

UnicodeDammit大部分时间都在正确猜测,但有时它会犯错误。有时它会正确猜测,但只有在逐字节搜索文档后才需要很长时间。

因此,您可以向构造函数添加from_encoding=参数:

soup = BeautifulSoup(page.content, 'lxml-xml', from_encoding='utf-8')

答案 1 :(得分:0)

如果您需要获取整个html,则需要使用html.parser

from bs4 import BeautifulSoup
import requests

url = 'http://www.tushmedia.com/'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

print(soup.prettify)

我使用lxml-xmlxml运行了您的代码 正如你所说。没有错误。

答案 2 :(得分:0)

尝试将其编码为utf-8

import requests
from bs4 import BeautifulSoup

page = requests.get('http://www.tushmedia.com/')
soup = BeautifulSoup(page.content, 'lxml')
print(soup.prettify().encode('utf-8'))