thinkphp做的上线网站,php网站后台管理系统,动态素材网站,建行官方网站登录文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找… 文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找标签 写在前面
本文主要介绍了python爬虫中的BeautifulSoup库的安装和使用,如果是爬虫小白,请先看文章爬虫入门与requests库的使用,再来看本文章,这样你会有更深刻地理解,当然大佬随意。
python 爬虫
BeautifulSoup库是什么
BeautifulSoup是一个用于解析 HTML 和 XML 文档的 Python 库它帮助你从网页中提取数据。这个库非常灵活并且可以与多种不同的解析器一起工作比如 Python 内置的 html.parser、lxml 或者 html5lib。
BeautifulSoup的安装
想要安装BeautifulSoup库,则需要执行以下安装命令:
pip install bs4pip install beautifulsoup4pip install soupsievepip install lxml
解析器对比 如上图其中markup为一个html文件或者html代码(字符串形式)。
BeautifulSoup的使用
BeautifulSoup 库中的4种类
BeautifulSoup 将复杂的 HTML 文档转换成由 Python 对象构成的树形结构主要包括以下四种类型的对象Tag, NavigableString, BeautifulSoup, 和 Comment。
Tag表示标签。NavigableString表示标签之间的文本内容。BeautifulSoup表示整个解析后的文档。Comment一种特殊的 NavigableString表示 HTML 中标签之间的注释。
获取标签
获取指定标签
Tag(获取标签):
from bs4 import BeautifulSoupwith open(filetest.html, moder, encodingutf-8) as fp:soup BeautifulSoup(markupfp, featureshtml.parser)# 解析html文件并将解析结果返回# 查找并获取HTML文档中的第一个 h2 标签。h2_tag soup.h2# 打印找到的 h2 标签如果有的话。如果没有找到 h2 标签则打印None。print(h2_tag)# 打印 h2 标签的数据类型。如果是有效的标签它将是bs4.element.Tag 类型#如果没有找到标签则是NoneType。print(type(h2_tag))# 打印标签名 print(h2_tag.name) # 修改标签名后打印并不会修改原HTML文档中的标签名 h2_tag.name h3 print(h2_tag.name)# 获取标签之间的文本内容(纯文本内容)如果标签中还有标签则返回None print(h1_tag.string) # 获取标签之间的文本内容如果标签中还有标签#则获取所有二级标签的内容以换行分隔# 最终将所有的文本内容拼接成一个字符串返回print(h1_tag.get_text())img_tag soup.img #获取到第一个img标签# 以字典方式获取标签的所有属性的键和值print(img_tag.attrs)# 获取img标签中属性alt的值如果属性不存在报KeyError错误print(img_tag[alt])# 获取img标签中属性alt的值如果属性不存在返回Noneprint(img_tag.get(alt))print(img_tag.attrs.get(alt))# 以上两种方式是同样的效果img_tag[alt] 修改后的alt# 打印修改后的alt的值print(img_tag[alt])# 删除属性del img_tag[alt]# 打印标签内容print(img_tag)下面详细地讲解一下需要注意的方法:
标签名.get_text():
# 获取标签之间的文本内容如果标签中还有标签
# 则获取所有二级标签的文本内容以换行分隔
# 最终将所有的文本内容拼接成一个字符串返回print(h1_tag.get_text())
divpHello/pspanWorld/span
/divdiv_tag.get_text() # 输出: \nHello\nWorld\n
div_tag.get_text(stripTrue) # 输出: HelloWorld
div_tag.get_text(separator | ) # 输出: \n | Hello | \n | World | \n获取标签的的子标签
获取指定标签的所有子节点标签及文本内容(列表形式返回)
标签名.contents:
标签名.contents#获取当前标签的直接子节点列表(不含子孙)divpHello/pspanWorld/span
/divdiv_tag.contents
# 输出: [\n, pHello/p, \n, spanWorld/span, \n]注意:与上面的标签名.get_text()作区别 获取指定标签的所有子节点标签及文本内容(迭代器形式返回)
soup.标签名.children
#获得标签对应的子标签和子字符串回车的迭代类型可以直接用于迭代
获取指定标签的所有子孙后代节点标签及文本内容(迭代器形式返回)
soup.标签名.descendants
# 获得标签对应的所有的子孙标签和子孙字符串的迭代类型可以直接用于迭代获取标签的的父标签(上行遍历)
获取指定标签的父标签(迭代器形式返回)
soup.标签名.parent
#获得标签对应的父标签
获取指定标签的所有先辈标签(迭代器形式返回),从直接父级开始逐级向上到文档根节点
soup.标签名.parents#获得标签对应的先辈标签的迭代类型可以直接用于迭代获取标签的兄弟标签(平行遍历)
获取指定标签相邻的下一个平行标签(按html代码顺序)
soup.标签名.next_sibling
#返回按html代码顺序的下一个平行节点标签获取指定标签相邻的上一个平行标签(按html代码顺序)
soup.标签名.previous_sibling
# 返回html代码顺序的上一个平行节点标签获取指定标签后续的所有平行标签(即按html代码顺序排在指定标签后的所有兄弟标签)
soup.标签名.previous_siblings
# 返回html代码顺序的后续所有平行节点标签获取指定标签前序的所有平行标签(即按html代码顺序排在指定标签前的所有兄弟标签)
soup.标签名.previous_siblings
#返回html代码顺序的前序所有平行节点标签获取注释
想要获取和操作html文件或代码中的注释,需要通过 BeautifulSoup 的 Comment 类。 Comment类的作用 提取注释内容从 HTML/XML 中提取被 !-- ... -- 包裹的注释文本。判断节点类型识别某个字符串节点是否为注释。 定位注释:
注释在 BeautifulSoup 中被解析为 Comment 类型的特殊字符串对象可通过以下方式获取
from bs4 import BeautifulSoup, Commenthtml
divp正文内容/p!-- 这是一个隐藏的注释 --
/div
soup BeautifulSoup(html, html.parser)# 方法1遍历所有字符串节点筛选出注释
comments soup.find_all(stringlambda text: isinstance(text, Comment))
for comment in comments:print(注释内容:, comment) # 输出: 这是一个隐藏的注释# 方法2直接通过标签访问若注释在标签内
div_tag soup.div
comment_in_div div_tag.find(stringlambda text: isinstance(text, Comment))
print(comment_in_div) # 输出: 这是一个隐藏的注释操作注释:
提取注释文本直接获取 Comment 对象的字符串。替换或删除注释 # 找到对应的注释
# 替换注释为普通文本
comment div_tag.find(stringlambda text: isinstance(text, Comment))
comment.replace_with(替换后的文本)# 删除注释
comment.extract()例子( 提取注释中的日期):
from bs4 import BeautifulSoup, Commenthtml
div classarticle!-- 文章发布时间2023-10-01 --h1标题/h1p正文内容.../p
/div
soup BeautifulSoup(html, html.parser)
div_tag soup.find(div, class_article)
#定位到了指定的标签# 查找注释并提取日期
comment div_tag.find(stringlambda text: isinstance(text, Comment))
if comment:date comment.strip().split()[-1]print(发布日期:, date) # 输出: 2023-10-01根据条件查找标签
soup.find_all(name,attrs,string)#name 目的标签名,同时查找多个标签时格式为
#name[标签名1,标签名2],nameTrue时,查找出所有标签#attrs 目的标签中的属性值,查找标签名与name相同,同时标签属性的所有值中有attrs的标签
#也可以直接对属性进行查找 soup.find_all(classtitle)
# 查找class属性的值为title的标签link soup.find_all(a, {class: sister, id: link2})
#同时对多个属性查找#string 对标签文本内容的查找(支持使用正则表达)#limit 限制返回结果的数量类似于 SQL 中的 LIMIT 关键字。
#当搜索到的结果数量达到限制时停止搜索并返回结果#recursive 控制是否检索所有子孙节点。
#如果设置为 False则只搜索直接子节点#函数作用:以列表的形式返回查找结果
#soup(……) ----------soup.find_all(……)如上,为常用的查找方法,其中soup.find()的作用是查找第一个匹配的标签,找到后立马返回,不再继续查找,其参数与soup.find_all(……)相同。
根据CSS选择器查找标签 #可以直接使用标签名查找元素
title_tags soup.select(title)
print(title_tags)#使用.类名选择类查找元素
sister_links soup.select(.sister)
print(sister_links)#使用井号#id名选择ID查找元素
link1 soup.select(#link1)
print(link1)#使用空格选择后代元素
bold_text soup.select(p b)
print(bold_text)#使用大于号子标签名选择直接子元素
direct_children soup.select(body p)
print(direct_children)
# 输出: [p classtitlebThe Dormouses story/b/p,
#p classstory.../p]# 输出body下所有子标签中的p标签#可以根据属性来选择元素
specific_link soup.select(a[hrefhttp://example.com/lacie])
print(specific_link)#可以使用伪类选择器例如选择第一个元素
first_sister soup.select(.sister:first-child)
print(first_sister)
#选择classsister的标签下的第一个子标签