解析库

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(html, 'html.parser') 速度适中,容错能力强 老版本python容错能力差
lxml HTML解析库 BeautifulSoup(html, 'lxml') 速度快,容错能力强 安装c语言库
lxml XML解析库 BeautifulSoup(html, 'xml') 速度快,唯一支持XML的解析器 安装c语言库
html5lib BeautifulSoup(html, 'html5lib') 最高的容错性,浏览器方式解析文档,生成HTML格式文档 速度慢

基本使用

from bs4 import BeautifulSoup

html = '''
<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>
''' soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())

选择标签

soup = BeautifulSoup(html, 'lxml')
print(soup.title) # <title>The Dormouse's story</title>
print(type(soup.title)) # <class 'bs4.element.Tag'>
print(soup.head) # <head><title>The Dormouse's story</title></head>
print(soup.p) # <p class="title"><b>The Dormouse's story</b></p>

可以看到,当有多个标签满足条件时,只返回了第一个。

获取标签名称(.name)

soup = BeautifulSoup(html, 'lxml')
print(soup.title.name) # title

获取属性(.attrs)

HTML 4定义了一系列可以包含多个值的属性.在HTML5中移除了一些,却增加更多.最常见的多值的属性是 class (一个tag可以有多个CSS的class). 还有一些属性 rel , rev , accept-charset , headers , accesskey . 在Beautiful Soup中多值属性的返回类型是list:

如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回

如果转换的文档是XML格式,那么tag中不包含多值属性

soup = BeautifulSoup(html, 'lxml')
print(soup.p.attrs['class']) # ['title']
print(soup.p['class']) # ['title']
print(soup.a.attrs['id']) # link1

以上两种方法都是可以实现的。

获取内容(.string/.strings)

soup = BeautifulSoup(html, 'lxml')
print(soup.p.string) # The Dormouse's story

嵌套选择

soup = BeautifulSoup(html, 'lxml')

# 获取head标签里面的title标签的内容
print(soup.head.title.string) # The Dormouse's story

子节点和子孙节点

contents以一个列表的形式返回所有的子节点

soup = BeautifulSoup(html, 'lxml')
# 将p标签下面的所有的子节点以列表的形式返回
print(soup.p.contents) # [<b>The Dormouse's story</b>]

children以一个迭代器的形式返回所有的子节点

soup = BeautifulSoup(html, 'lxml')
# 返回的是一个列表迭代器
print(soup.p.children) # <list_iterator object at 0x000002174E8C8128>
for i,child in enumerate(soup.p.children):
print(i,child) # 0 <b>The Dormouse's story</b>

descendants以一个迭代器的形式返回所有的子孙节点

soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants) # <generator object descendants at 0x000002A2AD9E86D0>
for i,child in enumerate(soup.p.descendants):
print(i,child)
# 0 <b>The Dormouse's story</b>
# 1 The Dormouse's story

父节点和祖先节点

parent来获取父节点

soup = BeautifulSoup(html, 'lxml')
print(soup.b.parent) # <p class="title"><b>The Dormouse's story</b></p>

parents来获取祖先节点,是一个迭代器的形式

soup = BeautifulSoup(html, 'lxml')
print(list(soup.b.parents))

兄弟节点

next_siblings获取后面的全部的兄弟节点,返回一个列表

soup = BeautifulSoup(html, 'lxml')
print(list(soup.p.next_siblings))

previous_siblings获取前面的全部的兄弟节点,返回一个列表

soup = BeautifulSoup(html, 'lxml')
print(list(soup.p.previous_siblings))

find_all()

find_all( name , attrs , recursive , text , **kwargs )

bs4中最常用的方法,find_all()方法返回满足条件的全部标签,find()方法只返回第一个标签。

返回结果是一个列表,每一个元素都是一个tag对象,可以使用get_text()来获取标签的文本。

  • name 参数

    可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.
soup.find_all("title")
# [<title>The Dormouse's story</title>]
  • keyword 参数

    如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索

    搜索指定名字的属性时可以使用的参数值包括 字符串 , 正则表达式 , 列表, True .

    为True时,相当于选取全部的带有该属性的标签,不论属性值是多少。
soup.find_all(id='link2')
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] soup.find_all(href=re.compile("elsie"))
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
  • attrs 参数

    有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性, 这时候使用attrs参数定义一个字典参数来搜索包含特殊属性的tag:
data_soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>]
  • text参数

    通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True .
soup.find_all(text='foo')
soup.find_all("a", text="Elsie")
  • limit 参数

    使用 limit 参数限制返回结果的数量
soup.find_all("a", limit=2)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
  • recursive 参数

    调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False
soup.html.find_all("title", recursive=False)

CSS选择器

通过select()直接传入CSS选择器即可

soup.select("title")
# [<title>The Dormouse's story</title>] soup.select("p nth-of-type(3)")
# [<p class="story">...</p>]

BeautifulSoup解析库的更多相关文章

  1. BeautifulSoup解析库的介绍和使用

    ### BeautifulSoup解析库的介绍和使用 ### 三大选择器:节点选择器,方法选择器,CSS选择器 ### 使用建议:方法选择器 > CSS选择器 > 节点选择器 ## 测试文 ...

  2. 第三节:Web爬虫之BeautifulSoup解析库

    Beautiful Soup官方说明: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为 ...

  3. BeautifulSoup与Xpath解析库总结

    一.BeautifulSoup解析库 1.快速开始 html_doc = """ <html><head><title>The Dor ...

  4. xpath beautiful pyquery三种解析库

    这两天看了一下python常用的三种解析库,写篇随笔,整理一下思路.太菜了,若有错误的地方,欢迎大家随时指正.......(conme on.......) 爬取网页数据一般会经过 获取信息-> ...

  5. Python爬虫3大解析库使用导航

    1. Xpath解析库 2. BeautifulSoup解析库 3. PyQuery解析库

  6. 解析库-beautifulsoup模块

    # -*- coding: utf-8 -*- from bs4 import BeautifulSoup # 安装:pip install beautifulsoup4 # Beautiful So ...

  7. 爬虫 解析库re,Beautifulsoup,

    re模块 点我回顾 Beautifulsoup模块 #安装 Beautiful Soup pip install beautifulsoup4 #安装解析器 Beautiful Soup支持Pytho ...

  8. Python爬虫【解析库之beautifulsoup】

    解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulS ...

  9. 解析库之re,Beautifulsoup

    本篇导航: 介绍 基本使用 遍历文档树 搜索文档树 总结     re模块在之前的python进阶中有讲过不再做过多的阐述,本篇为BeautifulSoup库的分析 20.collections模块和 ...

随机推荐

  1. 响应式布局之媒体查询 @media

    Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变内容的情况下,改变页面的布局以精确适应不同的设备. 媒体查询有两种玩法, ...

  2. 使用JavaScript实现使用鼠标画线的效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 【POJ】2774 Long Long Message

    [题意]给定两个字符串S和T,求最长公共子串.len<=10^5. [算法]后缀自动机 [题解]对字符串S建SAM,然后令串T在S上跑匹配. 这是自动机最原本的功能——匹配,就是串T在SAM(S ...

  4. 洛谷 Sorting a Three-Valued Sequence 三值的排序

    Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...

  5. SDUT 3923

    Description snow 是个热爱打字的家伙,每次敲出更快的速度都会让他很开心.现在,他拿到一篇新的打字文章,已知这篇文章只有 26 个小写英文字母,给出 snow 打出这 26 个英文字母分 ...

  6. 【洛谷 P2512】 [HAOI2008]糖果传递(贪心)

    题目链接 环形均分纸牌. 设平均数为\(ave\),\(g[i]=a[i]-ave\),\(s[i]=\sum_{j=1}^ig[i]\). 设\(s\)的中位数为\(s[k]\),则答案为\(\su ...

  7. SMTP暴力破解

    这里实现一个SMTP的暴力破解程序,实验搭建的是postfix服务器,猜解用户名字典(user.txt)和密码字典(password.txt)中匹配的用户名密码对, 程序开发环境是: WinXP VC ...

  8. c语言学习笔记.预处理.#ifndef

    #ifndef -> if not define 配合 #endif使用 在h头文件中使用,防止重复包含和编译. 也可以用条件编译来实现. 例如: 编写头文件 test.h 在头文件开头写上两行 ...

  9. 分享6款国内、外开源PHP轻论坛CMS程序

    第一.Startbbs Startbbs,一款国产个人兴趣分享的轻论坛程序,采用PHP+MYSQL架构,目前版本是V1.1.5,之前我也 有搭建使用过功能还是比较简单的,默认风格比较让普通用户接受,这 ...

  10. win10-idea2018

    下载jar JetbrainsCrack-2.9-release-enc.jar idea64.exe.vmpotions 配置 -javaagent:D:\devsoft\idea\bin\Jetb ...