3625

Python Beautiful Soup 4

<h1 id="beautiful-soup-4">Beautiful Soup 4

Beautiful Soup 是一个灵活方便的网页解析库,利用它不用编写正则表达式即可方便地提取的网页信息
官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

<h2 id="解析库">解析库</h2>

Beautiful Soup 支持 Python 标准库中的 HTML 解析器,还支持一些第三方的解析器
主要有几种:

from bs4 import BeautifulSoup BeautifulSoup(markup, "html.parser") # Python 标准库 BeautifulSoup(markup, "lxml") # lxml HTML 解析器 BeautifulSoup(markup, "xml") # lxml XML 解析器 = BeautifulSoup(markup, ["lxml", "xml"]) BeautifulSoup(markup, "html5lib") # html5lib

官方推荐使用 lxml

<h2 id="基本使用">基本使用</h2> from bs4 import BeautifulSoup soup = BeautifulSoup(markup, "lxml") print(soup.prettify()) <h2 id="对象">对象</h2>

Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag, NavigableString, BeautifulSoup, Comment

<h3 id="tag-对象">Tag 对象</h3> <h4 id="属性">属性</h4> <h5 id="标签名">标签名

通过 Tag.name 获取 Tag 对象的标签名
Tag.name 可以被修改,会在当前 BeautifulSoup 对象修改

<h5 id="属性-1">属性

标签的属性存储在字典中
通过 Tag.attr 可以获取属性字典,也可以直接用 key 查找 Tag[key]
如果一个属性对应多个值,则会返回一个列表
属性可以增加、删除、修改

from bs4 import BeautifulSoup soup = BeautifulSoup(markup, "lxml") tag = soup.div tag['id'] = 'i1' tag['class'] = ['c1', 'c2'] del tag['class'] print(tag.get('id')) <h3 id="navigablestring-对象">NavigableString 对象</h3>

字符串常被包含在tag内,并用 NavigableString 类包装
通过 tag.string 获取

<h3 id="beautifulsoup-对象">BeautifulSoup 对象</h3>

BeautifulSoup 对象表示的是一个文档的全部内容,大部分时候,可以把它当作 Tag 对象

<h2 id="选择器">选择器</h2> <h3 id="标签选择器">标签选择器</h3>

通过标签名可以找到第一个匹配的标签,包括它的子标签
还可以多次调用查找它的子标签
标签选择器返回的是 Tag 对象

from bs4 import BeautifulSoup soup = BeautifulSoup(markup, "lxml") print(soup.tag_name) print(soup.parent_tag.child_tag) <h3 id="子孙节点">子孙节点</h3> <h4 id="contents">contents</h4>

tag的 .contents 属性可以将 tag 的子节点以列表的方式输出

<h4 id="children">children</h4>

通过tag的 .children 生成器,可以对 tag 的子节点进行循环

list(tag.children) == tag.contents <h4 id="descendants">descendants</h4>

返回一个包含所有 tag 子孙节点的生成器对象

from bs4 import BeautifulSoup soup = BeautifulSoup(markup, "lxml") for i, child in enumerate(soup.children): print(i, child) <h3 id="祖先节点">祖先节点</h3> <h4 id="parent">parent</h4>

通过 .parent 属性来获取某个元素的父节点
文档顶层节点的父节点是 BeautifulSoup 对象, BeautifulSoup 对象没有父节点(None)

<h4 id="parents">parents</h4>

返回一个包含所有 tag 祖先节点的生成器对象

<h3 id="兄弟节点">兄弟节点</h3> <h4 id="next_sibling-previous_sibling">next_sibling & previous_sibling</h4>

通过 .next_sibling & .previous_sibling 属性来获取某个元素的后一个 (前一个) 兄弟节点
如果没有返回 None

<h4 id="next_siblings-previous_siblings">next_siblings & previous_siblings</h4>

通过 .next_siblings & .previous_siblings 属性可以对当前节点的兄弟节点迭代输出

<h3 id="标准选择器">标准选择器</h3> <h4 id="find_all">find_all</h4>

find_all() 方法搜索当前 tag 的所有 tag 子节点,并判断是否符合过滤器的条件
用法:

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

通过 name:

find_all('div')

通过 attr:

find_all(id='i1') find_all(class_='c1') find_all(id=True) find_all(href=re.compile('cnblogs.com/')) find_all(attr={'attr1': '1', 'attr2': '2'}) <h4 id="其他">其他</h4> find(name, attrs, recursive, text, **kwargs) # 返回找到的第一个 find_parents(name, attrs, recursive, text, **kwargs) # 对当前tag的祖先节点进行迭代, 返回所有符合条件的节点 find_parent(name, attrs, recursive, text, **kwargs) # 对当前tag的祖先节点进行迭代, 返回第一个符合条件的节点 find_next_siblings(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的兄弟节点进行迭代, 返回所有符合条件的节点 find_next_sibling(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的兄弟节点进行迭代, 返回第一个符合条件的节点 find_previous_siblings(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的兄弟节点进行迭代, 返回所有符合条件的节点 find_previous_sibling(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的兄弟节点进行迭代, 返回第一个符合条件的节点 find_all_next(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的 tag 和字符串进行迭代, 返回所有符合条件的节点 find_next(name, attrs, recursive, text, **kwargs) # 对当前tag的之后的 tag 和字符串进行迭代, 返回第一个符合条件的节点 find_all_previous(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的 tag 和字符串进行迭代, 返回所有符合条件的节点 find_previous(name, attrs, recursive, text, **kwargs) # 对当前tag的之前的 tag 和字符串进行迭代, 返回第一个符合条件的节点 <h3 id="css-选择器">CSS 选择器</h3>

Beautiful Soup支持大部分的CSS选择器, 在 Tag 或 BeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到tag

soup.select('#i1') # id 选择,选择 id = 'i1' 的标签 soup.select('.c1') # class 选择,选择 class = 'c1' 的标签 soup.select('body') # 标签选择,选择所有 body 标签 soup.select('body a') # 层级选择,选择 body 标签下的所有 a 标签 soup.select('body > a') # 层级选择,选择 body 标签下一层的所有 a 标签 soup.select('[attr1= "attr1"]') # 属性选择,选择所有 attr1 属性为 attr1 的标签 <h2 id="输出">输出</h2> <h3 id="格式化输出">格式化输出</h3>

prettify() 方法将 Beautiful Soup 的文档树格式化后以 Unicode 编码输出,每个 XML/HTML 标签都独占一行

通过 Beautiful Soup 4 预防 XSS 攻击 <--点击查看

<hr />

来源:博客园

作者:doubtful

链接:https://www.cnblogs.com/dbf-/p/11426118.html

Recommend