Skip to main content

快速开始

这里是一个HTML文档,我将用作整个文档的示例。这是 Alice in Wonderland 的故事的一部分:

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

通过Beautiful Soup运行“三姐妹”文档给我们一个 BeautifulSoup 对象,它将文档表示为嵌套数据结构:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())
# <html>
#  <head>
#   <title>
#    The Dormouse's story
#   </title>
#  </head>
#  <body>
#   <p class="title">
#    <b>
#     The Dormouse's story
#    </b>
#   </p>
#   <p class="story">
#    Once upon a time there were three little sisters; and their names were
#    <a class="sister" href="http://example.com/elsie" id="link1">
#     Elsie
#    </a>
#    ,
#    <a class="sister" href="http://example.com/lacie" id="link2">
#     Lacie
#    </a>
#    and
#    <a class="sister" href="http://example.com/tillie" id="link2">
#     Tillie
#    </a>
#    ; and they lived at the bottom of a well.
#   </p>
#   <p class="story">
#    ...
#   </p>
#  </body>
# </html>

以下是导航该数据结构的一些简单方法:

soup.title
# <title>The Dormouse's story</title>

soup.title.name
# u'title'

soup.title.string
# u'The Dormouse's story'

soup.title.parent.name
# u'head'

soup.p
# <p class="title"><b>The Dormouse's story</b></p>

soup.p['class']
# u'title'

soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

一个常见任务是提取页面<a>标签中找到的所有网址:

for link in soup.find_all('a'):
    print(link.get('href'))
# http://example.com/elsie
# http://example.com/lacie
# http://example.com/tillie

另一个常见任务是从页面中提取所有文本:

print(soup.get_text())
# The Dormouse's story
#
# The Dormouse's story
#
# Once upon a time there were three little sisters; and their names were
# Elsie,
# Lacie and
# Tillie;
# and they lived at the bottom of a well.
#
# ...

这看起来像你需要什么?如果是这样,请继续阅读。

安装Beautiful Soup

如果您使用的是最新版本的Debian或Ubuntu Linux,您可以使用系统软件包管理器安装Beautiful Soup:

$ apt-get install python-bs4 (for Python 2)

$ apt-get install python3-bs4 (for Python 3)

Beautiful Soup 4是通过PyPi发布的,所以如果你不能用系统软件包安装它,你可以安装它与 easy_installpip。包名称是 beautifulsoup4,同样的包适用于Python 2和Python 3.请确保您的Python版本使用正确的 pipeasy_install 版本(如果您使用的是Python 3,则可以分别命名为 pip3easy_install3) 。

$ easy_install beautifulsoup4

$ pip install beautifulsoup4

BeautifulSoup 包可能是 not 你想要的,这是以前的主要版本,Beautiful Soup 3 许多软件使用BS3,所以它仍然可用,但如果你正在编写新的代码,你应该安装 beautifulsoup4

如果您没有安装 easy_installpip,您可以使用 下载Beautiful Soup 4源tarball 并安装 setup.py

$ python setup.py install

如果所有其他失败,美丽的许可证允许您打包整个库与您的应用程序。您可以下载tarball,将其 bs4 目录复制到应用程序的代码库中,然后使用Beautiful Soup而不安装它。

我使用Python 2.7和Python 3.2来开发Beautiful Soup,但它应该与其他最新版本的工作。

安装后的问题

Beautiful Soup包装为Python 2代码。当您安装它与Python 3一起使用时,它会自动转换为Python 3代码。如果不安装软件包,代码将不会被转换。还有一些报告,在Windows机器上安装了错误的版本。

如果你得到 ImportError “没有模块命名的HTMLParser”,你的问题是,你运行的Python 2版本的代码在Python 3下。

如果你得到 ImportError “没有模块命名html.parser”,你的问题是,你运行Python 3版本的代码在Python 2下。

在这两种情况下,最好的办法是从系统中完全删除Beautiful Soup安装(包括解压缩tarball时创建的任何目录),然后再次尝试安装。

如果在 ROOT_TAG_NAME = u'[document]' 行上得到 SyntaxError “无效的语法”,则需要将Python 2代码转换为Python 3.您可以通过安装软件包来实现:

$ python3 setup.py install

或者通过在 bs4 目录中手动运行Python的 2to3 转换脚本:

$ 2to3-3.2 -w bs4

安装解析器

Beautiful Soup支持Python标准库中包含的HTML解析器,但它也支持一些第三方Python解析器。一个是 lxml解析器。根据您的设置,您可以使用以下命令之一安装lxml:

$ apt-get install python-lxml

$ easy_install lxml

$ pip install lxml

另一个选择是纯Python html5lib解析器,它以Web浏览器的方式解析HTML。根据您的设置,您可以使用以下命令之一安装html5lib:

$ apt-get install python-html5lib

$ easy_install html5lib

$ pip install html5lib

此表总结了每个解析器库的优点和缺点:

解析器

典型用法

优点

缺点

Python html.parser

BeautifulSoup(markup, "html.parser")

  • 包括电池

  • 体面速度

  • Lenient(从Python 2.7.3和3.2开始)

  • 不是很宽松(在Python 2.7.3或3.2.2之前)

lxml的HTML解析器

BeautifulSoup(markup, "lxml")

  • 非常快

  • 宽容

  • 外部C依赖

lxml的XML解析器

BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")

  • 非常快

  • 当前唯一支持的XML解析器

  • 外部C依赖

html5lib

BeautifulSoup(markup, "html5lib")

  • 非常宽松

  • 解析网页的方式与网络浏览器相同

  • 创建有效的HTML5

  • 非常慢

  • 外部Python依赖

如果可以,我建议你安装和使用lxml的速度。如果你使用的是早于2.7.3的Python 2版本或早于3.2.2的Python 3版本,那么你安装lxml或html5lib的是 essential - Python的内置HTML解析器不是很好旧版本。

注意,如果文档无效,不同的解析器会为它生成不同的美丽的树。有关详细信息,请参阅 解析器之间的区别

构建soup

要解析文档,请将其传递给 BeautifulSoup 构造函数。您可以传入字符串或打开的文件句柄:

from bs4 import BeautifulSoup

with open("index.html") as fp:
    soup = BeautifulSoup(fp)

soup = BeautifulSoup("<html>data</html>")

首先,文档转换为Unicode,HTML实体转换为Unicode字符:

BeautifulSoup("Sacr&eacute; bleu!")
<html><head></head><body>Sacré bleu!</body></html>

Beautiful Soup然后解析文档使用最好的可用解析器。它将使用HTML解析器,除非您特别声明使用XML解析器。 (见 解析XML。)