汇鑫网站建设方便,手机提取网页视频app,青岛 茶叶网站建设,进入公众号提示微信授权失败4-详细方法 | 用什么方法对文档树进行搜索#xff1f;1 过滤器1.1 字符串1.2 正则表达式1.3 列表1.4 True1.5 可以自定义方法2 find_all()2.1 参数原型2.2 name参数2.3 keyword 参数2.4 string 参数2.5 limit 参数2.6 recursive 参数3 find()4 find_parents()和find_parent()5…
4-详细方法 | 用什么方法对文档树进行搜索1 过滤器1.1 字符串1.2 正则表达式1.3 列表1.4 True1.5 可以自定义方法2 find_all()2.1 参数原型2.2 name参数2.3 keyword 参数2.4 string 参数2.5 limit 参数2.6 recursive 参数3 find()4 find_parents()和find_parent()5 find_next_siblings() 和 find_next_sibling()6 find_previous_siblings() 和 find_previous_sibling()7 find_all_next() 和 find_next()8 find_all_previous() 和 find_previous()9 本文涉及的源码BeautifulSoup的文档搜索方法有很多官方文档中重点介绍了两个方法
find() 和 find_all() 下文中的实例依旧是官网的例子
html_doc
htmlheadtitleThe Dormouses story/title/head
body
p classtitlebThe Dormouses story/b/pp classstoryOnce upon a time there were three little sisters; and their names were
a hrefhttp://example.com/elsie classsister idlink1Elsie/a,
a hrefhttp://example.com/lacie classsister idlink2Lacie/a and
a hrefhttp://example.com/tillie classsister idlink3Tillie/a;
and they lived at the bottom of a well./pp classstory.../p
from bs4 import BeautifulSoup
soup BeautifulSoup(html_doc, html.parser)1 过滤器
在介绍文档搜索方法之前先了解下各种过滤器。
1.1 字符串
即在搜索方法中传如一个字符串参数BeautifulSoup会查找与字符串完全匹配的内容如查找b标签
print(soup.find_all(b))输出为
[bThe Dormouses story/b]1.2 正则表达式
传入正则表达式作为参数Beautiful Soup会通过正则表达式的 match() 来匹配内容如找出所有以b开头的标签
import re
for tag in soup.find_all(re.compile(^b)):print(tag.name)输出为
body
b1.3 列表
传入列表参数Beautiful Soup会将与列表中任一元素匹配的内容返回如找到文档中所有a标签和b标签:
print(soup.find_all([a, b]))输出为
[bThe Dormouses story/b,
a classsister hrefhttp://example.com/elsie idlink1Elsie/a,
a classsister hrefhttp://example.com/lacie idlink2Lacie/a,
a classsister hrefhttp://example.com/tillie idlink3Tillie/a]1.4 True
True 可以匹配任何值如查找到所有的tag
for tag in soup.find_all(True):print(tag.name)输出为
html
head
title
body
p
b
p
a
a
a
p1.5 可以自定义方法
如果没有合适过滤器,那么还可以定义一个方法方法只接受一个元素参数如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False
2 find_all()
搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。比如
print(soup.find_all(title))输出为
[titleThe Dormouses story/title]2.1 参数原型
find_all( name , attrs , recursive , string , **kwargs )2.2 name参数
查找所有名字为 name 的tag如print(soup.find_all(title))输出为[titleThe Dormouses story/title]。
2.3 keyword 参数
如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索如print(soup.find_all(idlink2))输出为
[a classsister hrefhttp://example.com/lacie idlink2Lacie/a]按照CSS搜索可以通过 class_ 参数搜索有指定CSS类名的tag如print(soup.find_all(a, class_sister))输出为
[a classsister hrefhttp://example.com/lacie idlink2Lacie/a]
[a classsister hrefhttp://example.com/elsie idlink1Elsie/a, a classsister hrefhttp://example.com/lacie idlink2Lacie/a, a classsister hrefhttp://example.com/tillie idlink3Tillie/a]2.4 string 参数
通过 string 参数可以搜文档中的字符串内容.与 name 参数的可选值一样如print(soup.find_all(stringElsie))输出为[Elsie]
2.5 limit 参数
可以使用 limit 参数限制搜索返回结果的数量避免返回结果很大速度很慢如soup.find_all(a, limit2)输出为
[a classsister hrefhttp://example.com/elsie idlink1Elsie/a,
a classsister hrefhttp://example.com/lacie idlink2Lacie/a]2.6 recursive 参数
只搜索tag的直接子节点,可以使用参数 recursiveFalse 如
htmlheadtitleThe Dormouses story/title/head
...不使用recursive 参数
print(soup.html.find_all(title))输出为
[titleThe Dormouses story/title]使用recursive 参数
print(soup.html.find_all(title, recursiveFalse))输出为
[]3 find()
find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None。如print(soup.find(nosuchtag))输出为None。参数原型
find( name , attrs , recursive , string , **kwargs )4 find_parents()和find_parent()
参数原型
find_parents( name , attrs , recursive , string , **kwargs )find_parent( name , attrs , recursive , string , **kwargs )find_parents() 和 find_parent()用来搜索当前节点的父辈节点find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等如
a_string soup.find(stringLacie)
print(a_string)
print(a_string.find_parents(a))输出为
Lacie
[a classsister hrefhttp://example.com/lacie idlink2Lacie/a]5 find_next_siblings() 和 find_next_sibling()
参数原型
find_next_siblings( name , attrs , recursive , string , **kwargs )find_next_sibling( name , attrs , recursive , string , **kwargs )这2个方法通过 .next_siblings 属性对当tag的所有后面解析的兄弟tag节点进行迭代find_next_siblings() 方法返回所有符合条件的后面的兄弟节点find_next_sibling() 只返回符合条件的后面的第一个tag节点如
first_link soup.a
print(first_link)
print(first_link.find_next_siblings(a))
first_story_paragraph soup.find(p, story)
print(first_story_paragraph.find_next_sibling(p))输出为
a classsister hrefhttp://example.com/elsie idlink1Elsie/a
[a classsister hrefhttp://example.com/lacie idlink2Lacie/a, a classsister hrefhttp://example.com/tillie idlink3Tillie/a]
p classstory.../p6 find_previous_siblings() 和 find_previous_sibling()
参数原型
find_previous_siblings( name , attrs , recursive , string , **kwargs )find_previous_sibling( name , attrs , recursive , string , **kwargs )这2个方法通过 .previous_siblings 属性对当前tag的前面解析的兄弟tag节点进行迭代find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点。
7 find_all_next() 和 find_next()
参数原型
find_all_next( name , attrs , recursive , string , **kwargs )find_next( name , attrs , recursive , string , **kwargs )这2个方法通过 .next_elements 属性对当前tag的之后的tag和字符串进行迭代find_all_next() 方法返回所有符合条件的节点find_next() 方法返回第一个符合条件的节点。
8 find_all_previous() 和 find_previous()
参数原型
find_all_previous( name , attrs , recursive , string , **kwargs )find_previous( name , attrs , recursive , string , **kwargs )这2个方法通过 .previous_elements 属性对当前节点前面的tag和字符串进行迭代find_all_previous() 方法返回所有符合条件的节点find_previous() 方法返回第一个符合条件的节点。
9 本文涉及的源码
# -*- coding:utf-8 -*-
# 作者NoamaNelson
# 日期2023/2/17
# 文件名称bs04.py
# 作用beautifulsoup的应用
# 联系VX(NoamaNelson)
# 博客https://blog.csdn.net/NoamaNelsonfrom bs4 import BeautifulSouphtml_doc
htmlheadtitleThe Dormouses story/title/head
body
p classtitlebThe Dormouses story/b/pp classstoryOnce upon a time there were three little sisters; and their names were
a hrefhttp://example.com/elsie classsister idlink1Elsie/a,
a hrefhttp://example.com/lacie classsister idlink2Lacie/a and
a hrefhttp://example.com/tillie classsister idlink3Tillie/a;
and they lived at the bottom of a well./pp classstory.../psoup BeautifulSoup(html_doc, html.parser)
# 过滤器
# 字符串
print(soup.find_all(b))
# 正则表达式
import re
for tag in soup.find_all(re.compile(^b)):print(tag.name)
# 列表
print(soup.find_all([a, b]))
# True
for tag in soup.find_all(True):print(tag.name)# find_all()
print(soup.find_all(title))
print(soup.find_all(idlink2))
print(soup.find_all(a, class_sister))
print(soup.find_all(stringElsie))
print(soup.find_all(a, limit2))
print(soup.html.find_all(title, recursiveFalse))# find()
print(soup.find(nosuchtag))
a_string soup.find(stringLacie)
print(a_string)
print(a_string.find_parents(a))
first_link soup.a
print(first_link)
print(first_link.find_next_siblings(a))
first_story_paragraph soup.find(p, story)
print(first_story_paragraph.find_next_sibling(p))