Python爬虫:使用BeautifulSoup分析网页结构注意事项
开始我用BeautifulSoup分析网页时候这样做:
#从文件读取html源文件内容
with open("html.txt", "r", encoding='utf-8') as file:
content = file.read()
#替换转义字符
map = {"<" : "<",
">" : ">",
"&" : "&",
""" : "\"",
"©" : "©"}
for (k, v) in map.items():
content = content.replace(k, v)
#获取网页Tag结构
soup = BeautifulSoup(str, 'lxml')
后来发现会出现奇怪的问题,原来上面的替换多此一举。
BeautifulSoup会将HTML的实例都转换成Unicode编码,而且在获取内容时候会自动替换为字符串。
所以上面的代码可以直接简化为:
soup = BeautifulSoup(open("html.txt", "r", encoding='utf-8'), 'lxml')
具体例子:
from bs4 import BeautifulSoup
html_str = '''
<html><body>
<div>
> 我们的祖国是花园 <)
</div>
</body></html>
'''
soup = BeautifulSoup(html_str, 'lxml')
print(soup.div)
print(soup.div.string)
输出正常:
<div>
> 我们的祖国是花园 <)
</div>
> 我们的祖国是花园 <)
如果我们先对字符串进行了替换,如下面这个程序:
from bs4 import BeautifulSoup
html_str = '''
<html><body>
<div>
> 我们的祖国是花园 <)
</div>
</body></html>
'''
soup = BeautifulSoup(html_str, 'lxml')
print(soup.div)
print(soup.div.string)
输出:
<div>
> 我们的祖国是花园
</div>
> 我们的祖国是花园
发现<)
这两个字符会因为BeautifulSoup的容错能力而造成丢失。