BeautifulSoup4
1. 什么是BeautifulSoup4
- Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。
- 技术文档:
- 源码下载:
2. BS4入门
2.1 功能示例
# !/usr/bin/python
# Filename: test.py
# Data : 2020/07/16
# Author : --king--
# ctrl+alt+L自动加空格格式化
from bs4 import BeautifulSoup
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>
"""
# 返回时的是一个bs4.BeautifulSoup对象,'lxml'是解释器类型,也可以是html5lib等
soup = BeautifulSoup(html_doc,'lxml')
# print(type(soup))
# .pretiffy()函数可以实现格式化输出的功能
# print(soup.prettify())
# BeautifulSoup可以直接取出标签,标签名和标签中的内容
# print(soup.title.name)
# print(soup.title.text)同样可以实现
# print(soup.title.string)
# 通过标签导航,只能以字符串的形式返回第一个
# print(soup.p)
# 通过find_all可以以表格的形式返回所有
r = soup.find_all('a')
# print(r)
for i in r:
print(i)
# 用.get()可以返回标签中元素对应的内容
print(i.get('href'))
2.2 数据类型
- tag : 标签
- NavigableString : 可导航的字符串
- BeautifulSoup : bs对象
- Comment : 注释
3. 遍历节点
3.1 遍历子节点:.contents .children .descendants
# 遍历:contents,返回为一个列表,返回的是html的所有内容
r = soup.contents
print(r)
# 遍历:children,返回一个迭代器,返回的是子节点的内容
r = soup.a.children
print(r)
for i in r :
print(i)
# 遍历:descendants,返回的是一个生成器,遍历所有后代的内容
r = soup.descendants
print(r)
for i in r :
print(i)
3.2 获取字符串内容:.string .strings .stripped strings
- string获取标签里面的内容
- strings 返回是一个生成器对象用过来获取多个标签内容
- 如果存在多个标签,用.string去取会返回None;
- 用.strings返回的生成器,可以通过f遍历取值
- stripped strings 和strings基本一致 但是它可以把多余的空格去掉
3.3 遍历父节点:.parent .parents
- parent直接获得父节点
- parents获取所有的父节点
3.4 遍历兄弟节点:_sibling _siblings
• next_sibling 下一个兄弟结点
• next_siblings 下一个所有兄弟结点
• previous_sibling 上一个兄弟结点
• previous_siblings上一个所有兄弟结点
4. 搜索树:find, find_all和过滤器
4.1 find, find_all
• find_all()方法以列表形式返回所有的搜索到的标签数据
• find()方法返回搜索到的第一条数据
• find_all()方法参数
def find_all(self, name=None, attrs={}, recursive=True, text=None,
limit=None, **kwargs):
• name : tag名称
• attr : 标签的属性
• recursive : 是否递归搜索
• text : 文本内容
• limli : 限制返回条数
• kwargs : 关键字参数
4.2 过滤器
• 字符串过滤器
- find,find_all
• 正则表达式过滤器
- 用正则表达式里面compile方法编译一个正则表达式传给 find 或者 findall这个方法可以实现一个正则表达式的一个过滤器的搜索
• 列表过滤器
- 用列表指定多个值及进行搜索
• True过滤器
• 方法过滤器
- 通过传入方法()进行搜索
5. 修改文档树:append()和decompose()
- 修改tag的名称和属性
- 修改string 属性赋值,就相当于用当前的内容替代了原来的内容
- append() 像tag中添加内容,就好像Python的列表的 .append() 方法
- decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉