当我尝试使用下面的代码加载任何页面时,它只抓取标签<“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编码问题,但任何想法如何解决这个问题?
答案 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-xml
和xml
运行了您的代码
正如你所说。没有错误。
答案 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'))