bs4.py – 数据解析
'''
此文件中的 类和函数 均可看作是 bs4模块里面的对应注释
安装: pip install bs4
'''
class BeautifulSoup
'''
导入: from bs4 import BeautifulSoup
实例化: soup = BeautifulSoup(html, 解析器)
'''
soup对象
class BeautifulSoup():
def __init__(self, markup: str, features: str):
'''
初始化soup对象; 解析器读取文档
print(soup对象): <html>xx</html>
:param markup: 要解析的 (str)html; 也可以是本地的html 传入open(xx)即可
:param features: 指定解析器;
"lxml": 速度快; 文档容错能力强; 需安装 pip install lxml (首选)
"html.parser": 执行速度适中; 文档容错能力强; 内置标准库 无需安装 (次选,lxml无法解析的用它)
"html5lib": 速度慢; 最好的容错性; 以游览器的方式解析文档; 生成HTML5的文档; 需安装 pip install html5lib (次次选,html.parser无法解析的用它)
"xml": 速度快; 唯一支持XML的解析器; 需安装 pip install xml (xml语言的解析器, 没用过)
'''
Tag对象
'''
不同点:
soup对象是需要手动实例化后产生的 对象
Tag对象是soup对象调用方法后 返回的对象
相同点:
可以调用的方法是一样的
print(Tag对象): <标签>xx<标签>
'''
查找Tag对象
def find(self, name: str = None, attrs: dict = {}, recursive: bool = True, text: str = None):
'''
匹配 第一个符合 属性条件 的标签
:param name: (可选) 标签名, 如 'div' 、'span'...
:param attrs: (可选) 属性条件;
:param recursive: (可选) 只有Tag对象能用, 默认为True: 递归查找页面元素的子孙标签; 为False: 只查找当前Tag对象最上级标签的子标签
:param text: (可选) 按照字符串匹配, 完全匹配 比较鸡肋; 如: 要找'设置', 只能匹配到 <a>设置</a>, 匹配不到 <a>设置1</a>;
如只用text匹配, 则只返回匹配到的字符, 一般 当标签没有属性时,配合name使用.
:return: Tag对象(符合条件的html代码)
:属性条件用法:
1. 属性='值'; 例: name='xx', class_='xx' (不推荐)
2. attrs={'属性': '值',...}; 例: {'id': 'xx', 'name': 'xx'} (推荐)
'''
def find_all(self, name: str = None, attrs: dict = {}, recursive: bool = True, text: str = None, limit: int = None):
'''
匹配 所有符合 属性条件 的标签
:param name: (可选) 标签名
:param attrs: (可选) 属性条件; 用法同 find
:param recursive: (可选) 同 find
:param text: (可选) 同 find
:param limit: (可选) 找到 n 个符合条件的标签后就不找了
:return: 'bs4.element.ResultSet' 伪列表; 存放着所有符合条件的 Tag对象 的伪列表
'''
获取对象文本
@property
def text(self):
'''
获取(soup或Tag)对象中的文本;
:return: (str) (soup或Tag)对象中包含的所有 文本;
'''
def get_text(self,separator="", strip=False):
'''
获取(soup或Tag)对象中的文本;
:param separator: 分隔符; 每个节点的文本中间插入 分隔符 分隔
:param strip: 默认为False; True为 去除前后空白;
:return: (str) (soup或Tag)对象中包含的所有 文本;
'''
@property
def stripped_strings(self):
'''
用法1: 直接获得文本列表后手动处理列表
text_list = [text for text in (soup或Tag)对象.stripped_strings]
用法2: 数据量大时 遍历生成器 每次返回1个文本, 处理完在进行下次循环
:return: (生成器) 内含每个节点的文本
'''
获取属性
def attrs(self):
'''
返回一个字典, 存放着Tag对象当前最上级节点的 所有属性值
:return: (dict) 格式: {属性: 值} or {属性: [值, 值]}
'''
def get(self, key, default=None):
'''
封装的attrs()和普通字典的get一样; 获取Tag对象 当前最上级节点的指定属性值
可以简写为 Tag对象['属性名']
:param key: 属性名; 如 'id'、'name'、'class'...
:param default: 当 未找到"key"属性对应的值时, 返回 default的值
:return: 对应"key"的属性值; 未找到返回default的值(默认为None); 格式: (str)值 or (list)[值, 值]
'''
def get_attribute_list(self,key, default=None):
'''
和 get()一样, 不过返回值都为list格式
:param key: 属性名; 如 'id'、'name'、'class'...
:param default: 当 未找到"key"属性对应的值时, 返回 default的值
:return: (list) [值...]
'''