解析库

解析器 使用方法 优势 劣势
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. 压缩JS时生成source_map

    @echo off :: 当前目录 src/test set currDir=src/test/ set sourceMapFileName=test.js.map set inputList=%in ...

  2. 【洛谷 P4016】 负载平衡问题(费用流)

    题目链接 环形均分纸牌,既然是网络流23题的那就用网络流做把. 套路拆点. 供需平衡. 源点向大于平均数的点的入点连流量为这个数减去平均数的差,费用为0的边,表示需要移走这么多. 小于平均数的点的出点 ...

  3. 机器学习-kNN-数据归一化

    一.为什么需要数据归一化 不同数据之间因为单位不同,导致数值差距十分大,容易导致预测结果被某项数据主导,所以需要进行数据的归一化. 解决方案:将所有数据映射到同一尺度 二.最值归一化 normaliz ...

  4. 南邮PHP反序列化

    题目如下: <?php class just4fun { var $enter; var $secret; } if (isset($_GET['pass'])) { $pass = $_GET ...

  5. [006] largest_common_substring

    [Description] Given two different strings, find the largest successive common substring. e.g. str1[] ...

  6. [002] delete_duplication_of_linked_list

    [Description] Given a unsort linked list, delete all the duplication from them, no temporary space p ...

  7. 日常开发技巧:x11-forward,使用远程机器的gui程序

    背景 日常用过ssh登录服务器进行工作,尽管大部分时间,都只需要终端操作,编辑源码也是vim就够用了. 但有时候,还是需要使用gui程序的,比如打开一份pdf,word,ppt,excel等. 碰到这 ...

  8. http状态码说明

    在学习网页设计的时候都应该知道状态码,但我们常见的状态码都是200,404,下面介绍其他的状态值 1开头的http状态码表示临时响应并需要请求者继续执行操作的状态代码. 100   (继续) 请求者应 ...

  9. java中String的==和equals的区别

    首先看代码1: public static void main(String[] args) { List<String> list=new ArrayList<String> ...

  10. 设计模式之笔记--解释器模式(Interpreter)

    解释器模式(Interpreter) 定义 解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 类图 描述 Expr ...