python之BeautifulSoup4模块

目录

概述

安装模块

常见用法

获得对象

搜索方法


概述

       BeautifulSoup是一种专门用于进行HTML/XML数据解析的一种描述语言,可以很好的分析和筛选HTML/XML这样的标记文档中的指定规则数据。在数据筛选过程中其基础技术是通过封装HTML DOM树实现的一种DOM操作,通过加载网页文档对象的形式,从文档对象树模型中获取目标数据。
       BeautifulSoup操作简单易于上手,在很多对于数据筛选性能要求并不是特别苛刻的项目中经常使用,目前市场流行的操作版本是BeautifulSoup4,经常称BS4。

        Xpath和BeautifulSoup都是基于DOM的一种操作模式。不同点在于加载文档对象模型DOM时出现的文档节点遍历查询操作过程,Xpath在进行遍历操作时针对描述语言指定的语法结构进行局部DOM对象树的遍历得到具体的数据,但是BS4在操作过程中,会将整个文档树进行加载然后进行查询匹配操作,使用过程中消耗资源较多,处理性能相对Xpath较低,但优势在于足够简单。       

安装模块

pip install beautifulsoup4

è¿éåå¾çæè¿°

常见用法

获得对象

一般BS4将HTML文档对象会转换成如下四种类型组合的文档树:
* Tag:标签对象
* NavigableString:字符内容操作对象
* BeautifulSoup:文档对象
* Comment:特殊类型的NavigableString

from bs4 import BeautifulSoup

soup = BeautifulSoup("<html><body><p>data</p></body></html>")    # 获得文档对象(beautifulsoup)
# 返回<html><body><p>data</p></body></html>

# 以列表形式返回soup或标签的子节点
soup.contents

soup('p')
# 返回文档对象中所有p标签的列表[<p>data</p>]

soup.p    # 获得标签对象(tag)
# 返回文档对象中第一个p标签<p>data</p>

# 按标准格式输出文档对象
print(soup.prettify())

# 获得文档对象的所有内容
print(soup.get_text())

# 获取tag对象的name属性
print(soup.p.name)    # 获得字符内容操作对象(NavigableString)


搜索方法

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

        name:需要搜索的子标签名称,搜索标签名称时可以使用的参数值包括字符串、正则表达式、列表和True

        attrs:即keyword参数,如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。搜索指定名字的属性时可以使用的参数值包括字符串、正则表达式、列表和True

        recursive:默认检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False

        string:需要搜索的子标签包含的字符串,可以使用的参数值包括字符串、正则表达式、列表和True

        **kwargs:需要传入的其它参数,如limit=1传入可以限定搜索结果的数量,达到数量后停止搜索

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件,返回所有元素的列表。

soup.find_all("title")    # 返回所有title标签列表
soup.find_all("p", "title")    # 返回所有某个属性值为title的p标签列表
soup.find_all(id="link2")    # 返回所有id属性值为link2的标签列表

soup.find(string=re.compile("sisters"))    # 返回第一个匹配siters字符串的标签内容
soup.find_all(string=["Tillie", "Elsie", "Lacie"])    # 返回所有匹配列表元素的标签内容
soup.find_all(href=re.compile("elsie"))    # 返回所有href属性匹配elsie值的标签列表

soup.find_all(id=True)    # 返回所有包含id属性的标签列表
soup.find_all(href=re.compile("elsie"), id='link1')    #同时过滤多个条件并返回匹配的标签列表

soup.find_all(string=re.compile("Dormouse"))    # 返回所有模糊匹配Dormouse的标签内容
def is_the_only_string_within_a_tag(s):
    ""Return True if this string is the only child of its parent tag.""
    return (s == s.parent.string)
soup.find_all(string=is_the_only_string_within_a_tag)    # 参数传入方法并返回所有匹配的标签列表

但是,有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:

data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression

但是可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:

data_soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>]

按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_参数搜索有指定CSS类名的tag:

soup.find_all("a", class_="sister")

# class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True
soup.find_all(class_=re.compile("itl"))

def has_six_characters(css_class):
    return css_class is not None and len(css_class) == 6
soup.find_all(class_=has_six_characters)

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

find_all() 方法搜索当前tag的第一个tag子节点,并判断是否符合过滤器的条件,并返回该元素。

Reference:https://beautifulsoup.readthedocs.io/zh_CN/latest/#id18

猜你喜欢

转载自blog.csdn.net/u010378984/article/details/82753617
今日推荐