Python爬虫:使用BeautifulSoup分析网页结构注意事项

开始我用BeautifulSoup分析网页时候这样做:

#从文件读取html源文件内容
with open("html.txt", "r", encoding='utf-8') as file:
    content = file.read()
    
#替换转义字符    
map = {"&lt;" : "<",
        "&gt;" : ">",
        "&amp;" : "&",
        "&quot;" : "\"",
        "&copy;" : "©"}
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>
&gt; 我们的祖国是花园 &lt;)
</div>
</body></html>
'''
soup = BeautifulSoup(html_str, 'lxml')
print(soup.div)
print(soup.div.string)

输出正常:

<div>
&gt; 我们的祖国是花园 &lt;)
</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>
&gt; 我们的祖国是花园 
</div>

> 我们的祖国是花园 

发现<)这两个字符会因为BeautifulSoup的容错能力而造成丢失。

posted @ 2018-12-28 09:05  xuejianbest  阅读(442)  评论(0编辑  收藏  举报