BeautifulSoup快速文档

BeautifulSoup的使用文档

Installation

在Debian和Ubuntu中,可以通过包管理器安装

apt-get install python-bs4 # python2
apt-get install python3-bs4 # python3

或者可以直接使用python的包管理器进行安装

pip install beautifulsoup4
easy_install install beautifulsoup4

Install a parser

Beautiful Soup默认使用python标准库中的默认的HTML的解析器。但是,为了在解析速度上获取一定的性能提升,我们可以手动选择一些解析器。

解析器 用例 优点 缺点
Python’s html.parser BeautifulSoup(markup, “html.parser”) 无外部依赖 速度尚可 支持较多python版本 速度慢于lxml,功能少于html5lib
lxml’s HTML parser BeautifulSoup(markup, “lxml”) 非常快速 支持较多python版本 依赖C
lxml’s XML parser BeautifulSoup(markup, “lxml-xml”) 非常快速 支持XML 依赖C
html5lib BeautifulSoup(markup, “html5lib”) 解析方式类似与web浏览器 支持html5 速度较慢,部分python依赖

Make the soup

默认支持file-like对象或者直接使用unicode字段。

from bs4 import BeautifulSoup

with open("index.html") as f:
    soup = BeautifulSoup(fp)
soup = BeautifulSoup("<html>data</html>")

Kinds of objects

BeautifulSoup会把html文档解析成一个复杂的Python对象树。但是,一般操作的对象只有Tag、NavigableString、BeautifulSoup和Comment。

Tag

对应着html中的Tag标签

soup = BeautifulSoup("<a id=\"c\">Hello</a>"
tag = soup.b
type(tag) === Tag

# name
tag.name # a
# change name
tag.name = "c"

# attributes
tag["id"] # c
tag.attrs # {"id": "c"}
# operate tag's attribute
tag["id"] = "ddd" # <a id="ddd">Hello</a>
tag["id2"] = "ccc" # <a id="ddd" id2="ccc">Hello</a>
del tag["id2"] # <a id="ddd">Hello</a>
tag.get("id") # ddd

# multi-value attributes
”“”
BeautifulSoup支持将具有多个值的标签属性解析为一个列表,默认此属性是开启的,比如对于class属性
<a class="cls1 cls2"></a> => Tag_a["class"] => ["cls1", "cls2"]
我们可以通过在BeautifulSoup的生命中设置multi_valued_attributes选项控制此解析行为
“”“
css_soup = BeautifulSoup('<p class="body"></p>')
css_soup.p['class']
# ["body"]

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]

no_list_soup = BeautifulSoup('<p class="body strikeout"></p>', 'html', multi_valued_attributes=None)
no_list_soup.p['class']
# u'body strikeout'

NavigableString

用于代表html标签中的文本

tag.string # str
type(tag.string) # bs4.element.NavigableString

# 可以直接使用Unicode字符串进行转换
uncideo_string = unicode(tag.string)

# 该对象不支持直接编辑
# 可以直接通过replace_with对于字符串内容进行编辑
tag.string.replace_with("hello") # <tag>str</tag> -> <tag>hello</tag>

如果需要额外使用该对象的文本内容,建议使用Unicode进行转化后使用,其带着对整个解析树的应用,会造成内存的浪费。

BeautifulSoup

BeautifulSoup对象在绝大部分情况下可以看成基础的Tag进行使用,而Tag的大部分方法都是支持的,它的name属性是一个特定的值[document]

关于文档的注释和一些特殊字符

注释

对于注释,不同的访问形式得到的内容是不同的

soup = BeautifulSoup("<b><!--Hey?--></b>")
comment = soup.b.string # => bs4.element.Comment
comment # Hey?
soup.b.prettify() # =>
"""
<b>
  <!--Hey?-->
</b>
"""

Stylesheet、Script和TemplateString

BeautifulSoup支持解析HTML文档中的Stylesheet、Script和TemplateString解析成对应的对象。

<style></style> <!-- bs4.element.Stylesheet -->
<script></script> <!-- bs4.element.Script -->
<template></template> <!-- bs4.element.TemplateString -->

注意 该功能尽在BeautifulSoup > 4.9.0支持,且目前的html5lib解析器未支持
这些对象的使用方法和NavigableString对象相同。

CDATA

对于特殊的CDATA的对象,也有一部分特定的新类别,如CData。

from bs4 import BeautifulSoup
cdata = CData("A CDATA block")
soup.xml.replace_with(cdata)
soup.xml.prettify() # =>
"""
<xml>
  <![CDATA[A CDATA block]]>
</xml>
"""

导航树

官方文档

(未完待续)

猜你喜欢

转载自blog.csdn.net/m0_37964621/article/details/105873469