一、关于Beautiful Soup的简介
Beautiful Soup支持Python标准库中的HTML解析器(html.parser),有如下特点:
1,功能:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
2,编码问题:Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
3,性能:Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
4,版本问题:Beautiful Soup:可同时支持Python2.7和Python3.2。目前Beautiful Soup的版本是Beautiful Soup 4,且移植到了BS4中(Beautiful Soup 3已停止开发);
二、Beautiful Soup 的安装:
Beautiful Soup当前的最新版本:4.3.2。下载地址
https://pypi.python.org/pypi/beautifulsoup4/4.3.2
利用 pip 或者 easy_install 来安装,以下方法均可
pip install beautifulsoup4 #直接pip安装,推荐
easy_install beautifulsoup4 #直接easy_insall安装,推荐
sudo python setup.py install#下载版本后解压安装
三、Beautiful Soup 中的 lxml
Beautiful Soup 还支持一些第三方的解析器,其中一个是强大的lxml .根据操作系统不同,可以选择下列方法来安装lxml(lxml除了html解析器还有xml解析器),还可以支持纯Python实现的html5lib解析器, html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib。可像安装其它组件一样的安装,如下:
$ easy_install lxml
$ pip install lxml
$ easy_install html5lib
$ pip install html5lib
在进行分析时,需要指定解析器,如下面的两行代码,上面这行代码运行时不指定html.parser解析器,则会报错提示你使用html.parser:
sout = BeautifulSoup(cont)
#soup = BeautifulSoup(cont, "html.parser")
报错如下:
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 14 of the file test.py. To get rid of this warning, change code that looks like this:
BeautifulSoup([your markup])
to this:
BeautifulSoup([your markup], "html.parser")
markup_type=markup_type))
Traceback (most recent call last):
File "test.py", line 17, in <module>
print soup
NameError: name 'soup' is not defined
shell returned 1
四、 Beautiful Soup 的使用
Beautiful Soup使用非常方便快速,如果有Jquery基础更好。因为它可以支持CSS选择器,下面的例子就是使用的CSS选择器。下面举一个简单的例子,代码如下:
from bs4 import BeautifulSoup
cont = '<html><head><title>城市数据</title></head><body><table><tr class="cu"><td>全市</td><td class="you lv">334</td><td class="you lv">30355.87</td><td class="you lv">350</td
><td class="you lv">31476.48</td></tr></table></body></html>'
soup = BeautifulSoup(cont, "html.parser")
td = soup.select('table > tr > td')
#print soup.prettify()
print td
print '-----------'
for data in td:
print data.get_text()
执行后显示的结果如下图,soup.prettify()可以让结果以一种目录结构(像XML)直接在linux中显示,可以试试。
五、Beautiful Soup 更多参考
更详细的用法文档见官网:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html ,下面罗列上面提到的几个解析器的优缺点对比:
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") |
|
|
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
|
|
lxml XML 解析器 | BeautifulSoup(markup, ["lxml", "xml"]) BeautifulSoup(markup, "xml") |
|
|
html5lib | BeautifulSoup(markup, "html5lib") |
|
|