Skip to content

[TOC]

About

安装

python
pip install beautifulsoup4    # 目前更新到了第4版

解析器

html.parser

html.parser是Python内置的标准库。

下载

无需下载。

使用

python
from bs4 import BeautifulSoup

html = "<h1>html.parser</h1>"
soup = BeautifulSoup(html, 'html.parser')
print(soup.find(name='h1').text)  # html.parser

优势

Python内置标准库,执行速度适中,文档容错能力强。

劣势

Python2.7.3 或者Python3.2.2前的版本中文容错能力差。

lxml

html.parser是Python内置的标准库。

下载

pip install lxml

https://pypi.org/project/lxml/

使用

python
from bs4 import BeautifulSoup

html = "<h1>lxml</h1>"
soup = BeautifulSoup(html, 'lxml')
print(soup.find(name='h1').text)  # lxml

优势

速度快,文档容错能力强。

劣势

需要安装C语言库。

xml

html.parser是Python内置的标准库。

下载

pip install lxml

xml解析器属于lxml包,所以只要下载了lxml,就无需再下载xml

使用

python
from bs4 import BeautifulSoup

html = "<h1>xml</h1>"
soup = BeautifulSoup(html, 'xml')
print(soup.find(name='h1').text)  # xml

优势

速度快,唯一支持XML的解析器

劣势

需要安装C语言库。

html5lib

html.parser是Python内置的标准库。

下载

pip install html5lib

https://pypi.org/project/html5lib/

使用

python
from bs4 import BeautifulSoup

html = "<h1>html5lib</h1>"
soup = BeautifulSoup(html, 'html5lib')
print(soup.find(name='h1').text)  # html5lib

优势

最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档。

python
from bs4 import BeautifulSoup

html = '<h1>text</p>'
soup = BeautifulSoup(html, 'html.parser')
print(soup)  # <h1>text</h1>

soup = BeautifulSoup(html, 'lxml')
print(soup)  # <html><body><h1>text</h1></body></html>

soup = BeautifulSoup(html, 'html5lib')
print(soup)  # <html><head></head><body><h1>text<p></p></h1></body></html>

由上例可以看到,只有html5lib解析器会补全错误的标签。

劣势

速度慢,不依赖外部扩展。

使用

在与脚本文件同级目录,有这样的一个HTML文件,我们以这个为测试对象。

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>BeautifulSoup4</title>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-3">
            <p style="color: red;">p1</p>
            <p style="font-size: 12px;">p2</p>
            <p>p3</p>
        </div>
        <div class="col-md-4">
            <a href="https://www.baidu.com">百度</a>
            <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1568638318957&di=1d7f37e7caece1c39af05b624f42f0a7&imgtype=0&src=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%2F201501%2F17%2F20150117224236_vYFmL.jpeg" alt="">
        </div>
    </div>
</div>
</body>
</html>

我们使用open函数将HTML文本读出来,交给beautifulsopu去解析处理。

python
from bs4 import BeautifulSoup

text = open('beautiful.html', 'r', encoding='utf-8').read()
soup = BeautifulSoup(text, 'lxml')
print(soup.prettify())

see also:lxml.html 中几种解析器的区别 | | | |