网站关键词排名优化推广软件,许昌网站设计制作,看视频的app有哪些,东营建设信息网(东营市住房和城乡爬虫 BeautifulSoup模块
【一】介绍
【1】说明
BeautifulSoup库是python的一个第三方库#xff0c;主要用于处理HTML和XML文档他提供了一些简单的、python式的函数来解析、导航、搜索以及修改分析树#xff0c;使得从网页抓取的数据变得简单高效BeautifulSoup自动将输入文…爬虫 BeautifulSoup模块
【一】介绍
【1】说明
BeautifulSoup库是python的一个第三方库主要用于处理HTML和XML文档他提供了一些简单的、python式的函数来解析、导航、搜索以及修改分析树使得从网页抓取的数据变得简单高效BeautifulSoup自动将输入文档的转换为Unicode编码输出文档转换为UTF8编码用户无需担心编码问题BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构并将每个节点表示为Python对象
【2】安装引入
安装注意是4
pip install BeautifulSoup4导入
from bs4 import BeautifulSoup【3】解析器
解析器使用方法特点自带html.parserBeautifulSoup(页面源码,‘html.parser’)简单易用标准库的一部分无需安装速度适中性能不是最快的但对于大所数常见任务足以功能基础提供了基本的HTML解析功能对复杂的HTML或错误会吃力第三方lxmlBeautifulSoup(页面源码,‘lxml’)性能优越所有python HTML/XML解析器中性能最好的功能丰富支持Xpath和CSS选择器需要自行导入安装第三方html5libBeautifulSoup(页面源码,‘html5lib’)兼容性好能够处理不符合规范的HTML代码纯Python实现无需任何外部依赖可在任何支持Python的环境中使用速度相对较慢兼容性和纯Python导致它符合HTML5规范
【4】四种主要对象 BeautifulSoup 对象 当使用Beautiful Soup解析一个HTML或XML文档时会得到一个BeautifulSoup对象。这个对象基本上是一个包含了整个解析后的文档内容的容器。可以通过BeautifulSoup对象来访问和搜索文档中的其他对象如Tag、NavigableString和Comment。 Tag 对象 Tag 对象对应于HTML或XML文档中的标签。例如在pThis is a paragraph./p中p和/p是标签它们会被解析为Tag对象。每个Tag对象都有名称和属性可以通过.name和.attrs来访问。此外Tag对象还可以包含其他Tag对象、NavigableString对象或Comment对象这些可以通过.contents和.children等属性来访问。tag的属性可以被添加、删除或修改 tag的属性操作方法与字典一样 NavigableString 对象 NavigableString 对象代表标签之间的文本内容。在上面的例子中“This is a paragraph.”就是一个NavigableString对象。与普通的Python字符串不同NavigableString对象可以与文档中的其他部分如Tag对象进行交互和搜索。 Comment 对象 Comment 对象代表HTML或XML文档中的注释。在HTML中注释以!--开始以--结束。这些注释在解析时会被转换为Comment对象。与Tag和NavigableString对象类似Comment对象也是文档树的一部分可以通过Beautiful Soup进行搜索和访问。
【二】文档树操作
【1】基础方法 soup.tag.name 获取标签的名称 soup.tag.attrs 获取标签的所有属性返回一个字典没有属性就是None soup.tag[attribute] 获取标签的指定属性属性有多个值的返回一个列表 soup.tag.string 获取标签中的单个字符串的内容如果标签内含有多个子节点包括其他标签或字符串则结果为None soup.tag.strings 返回一个生成器可以遍历标签及所有其子节点的字符串内容 soup.tag.text 获取标签及其所有子节点的文本内容 soup.tag.stripped_strings 返回一个生成器可以遍历标签及其所有子节点的非空白字符串(空格换行都可以去掉)内容 soup.tag.tag.tag 可以嵌套选择类似于链式操作
from bs4 import BeautifulSouphtml
p classbtn btn-primary idb1
nbsp;nbsp;前面几个空格b后面有空格nbsp;/b
nbsp;前面有空格/psoup BeautifulSoup(html, lxml)# 获取标签的名称
print(soup.p.name)
# 获取标签所有属性
print(soup.p.attrs)
# 获取指定属性
print(soup.p[class])
# 获取标签下单个字符串内容
print(soup.p.string) # 因为含有子标签为None
print(soup.b.string)
# 获取标签和子节点的所有文本内容
print(soup.p.text)
# 获取标签下的所有文本内容生成器
print(soup.p.strings)
for string in soup.p.strings:print(string)
# 去除空行和空格
print(soup.p.stripped_strings)
for string in soup.p.stripped_strings:print(string)
【2】遍历文档树 按照某种顺序如深度优先或广度优先访问文档树中的每个节点 soup.tag.contents 当前标签的直接 子节点列表(包括子标签和字符串内容) soup.tag.children 当前标签的直接 子节点生成器 soup.tag.descendants 当前标签的所有 子节点生成器是深度优先遍历会识别换行和空格 soup.tag.parent 当前节点的父节点 soup.tag.parents 当前节点的所有祖先节点生成器 soup.tag.next_sibling 当前节点的上一个兄弟节点**会识别到换行和空格** soup.tag.previous_sibling 当前节点的上一个兄弟节点**会识别到换行和空格** soup.tag.next_siblings 当前节点之后的所有兄弟节点迭代器 soup.tag.previous_siblings 当前节点之前的所有兄弟节点迭代器
from bs4 import BeautifulSouphtml
html langen
bodyb.../bp classstoryOnce upon a time there were three little sisters; and their names were
a hrefhttp://example.com/elsie classsister idlinkElsie/a,
and they lived at the bottom of a well./pp.../p
/body
/htmlsoup BeautifulSoup(html, lxml)# 直接子节点列表
print(soup.p.contents)
print(soup.p.children) # list_iterator object at 0x0000016CFBEE9750
# 父节点列表
print(soup.p.parent)
print(soup.p.parents)
# 兄弟节点
print(soup.p.next_sibling)
print(soup.p.previous_sibling)
# 所有兄弟节点
print(soup.p.next_siblings)
print(soup.p.previous_siblings)【3】搜索文档树
根据某些条件如标签、属性、文本内容等在文档树中查找节点
1查找多个find_all
语法
find_all(name, attrs, recursive, limit, string, **kwargs)name: 字符串 传入标签名返回所有对应的标签例如namea 拿到所有的a标签 正则表达式 根据正则表达式匹配标签例如namere.compile(^b) 拿到所有的b开头的标签 列表 匹配列表中的元素满足一个的就可以例如name[‘a’, ‘p’] 拿到所有的a标签和p标签 方法 自定义方法匹配元素 例如匹配含有class属性且没有ID属性的标签 def has_class_but_no_id(tag):return tag.has_attr(class) and not tag.has_attr(id)soup.find_all(namehas_class_but_not_id)True 返回所有的标签不会返回的当前标签的字符串内容默认就是True attrs和**kwargs 根据属性进行查找多个属性之间是与的关系 也可以使用正则class属性的特殊一空格分割多个且需要写成class_自定义属性可以使用attrs,也可以直接写arrts属性直接是与的关系 例如 # 查找含有href属性值是指定网址的标签
soup.find_all(hrefhttp://example.com/)
soup.find_all(attrs{href: http://example.com/})# 也可以使用正则
soup.find_all(hrefre.compile(http://))# class属性的特殊一空格分割多个且需要写成class_
# id属性就不能空格分隔多个
from bs4 import BeautifulSoup
html
p classc1 c2 idid 1 .../psoup BeautifulSoup(html, lxml)
print(soup.find_all(class_c1, idid 1))# 自定义属性可以使用attrs,也可以直接写
from bs4 import BeautifulSoup
html
p specialss .../psoup BeautifulSoup(html, lxml)
print(soup.find_all(specialss))
print(soup.find_all(attrs{special: ss}))# arrts属性直接是与的关系
from bs4 import BeautifulSoup
html
p ssss aaaa .../psoup BeautifulSoup(html, lxml)
print(soup.find_all(attrs{ss: ss, aa: aa}))
print(soup.find_all(attrs{ss: ss, aa: a}))recursive 用于控制是否递归往下查询默认为True会遍历当前tag的所有子孙节点想要直接子节点可设置recursive Fasle limit 限制返回的结果数量达到一定数量直接停止消耗资源较少和Sql的limit一样 string 根据内容搜索标签可以是字符串、列表、正则表达式等和name属性一样
2查找单个find
和find_all()的参数一样区别在于 数量 find返回第一个满足条件的find_all返回所有满足条件find_all(limit1)等价于find() 格式如果为空 find返回Nonefind_all返回空列表
3拓展 find_parents() 和 find_parent() find_parents()返回所有符合条件的父级tag结果是一个生成器。find_parent()返回第一个符合条件的父级tag。 find_next_siblings() 和 find_next_sibling() find_next_siblings()返回所有符合条件的后续兄弟tag结果是一个列表。find_next_sibling()返回第一个符合条件的后续兄弟tag。 find_all_next() 和 find_next() find_all_next()返回所有符合条件的后续tag和文本内容结果是一个生成器。find_next()返回第一个符合条件的后续tag或文本内容。
【三】CSS选择器 官网CSS 选择器参考手册 (w3school.com.cn) 使用方法基本都是页面复制selector soup.select_one()返回查找的第一个soup.select()[0].attrs获取属性soup.select()[0].get_text() CSS 选择器 选择器例子例子描述.class.intro选择 class“intro” 的所有元素。.class1.class2.name1.name2选择 class 属性中同时有 name1 和 name2 的所有元素。.class1 .class2.name1 .name2选择作为类名 name1 元素后代的所有类名 name2 元素。#id#firstname选择 id“firstname” 的元素。**选择所有元素。elementp选择所有 元素。element.classp.intro选择 class“intro” 的所有 元素。element,elementdiv, p选择所有 元素和所有 元素。 element elementdiv p选择 元素内的所有 元素。 elementelementdiv p选择父元素是 的所有 元素。 elementelementdiv p选择紧跟 元素的首个 元素。 element1~element2p ~ ul选择前面有 元素的每个 元素。 [attribute][target]选择带有 target 属性的所有元素。[attributevalue][target_blank]选择带有 target“_blank” 属性的所有元素。[attribute~value][title~flower]选择 title 属性包含单词 “flower” 的所有元素。[attribute|value][lang|en]选择 lang 属性值以 “en” 开头的所有元素。[attribute^value]a[href^“https”]选择其 src 属性值以 “https” 开头的每个 元素。[attribute$value]a[href$“.pdf”]选择其 src 属性以 “.pdf” 结尾的所有 元素。[attribute*value]a[href*“w3school”]选择其 href 属性值中包含 “abc” 子串的每个 元素。:activea:active选择活动链接。::afterp::after在每个 的内容之后插入内容。::beforep::before在每个 的内容之前插入内容。:checkedinput:checked选择每个被选中的 元素。:defaultinput:default选择默认的 元素。:disabledinput:disabled选择每个被禁用的 元素。:emptyp:empty选择没有子元素的每个 元素包括文本节点。:enabledinput:enabled选择每个启用的 元素。:first-childp:first-child选择属于父元素的第一个子元素的每个 元素。::first-letterp::first-letter选择每个 元素的首字母。::first-linep::first-line选择每个 元素的首行。:first-of-typep:first-of-type选择属于其父元素的首个 元素的每个 元素。:focusinput:focus选择获得焦点的 input 元素。:fullscreen:fullscreen选择处于全屏模式的元素。:hovera:hover选择鼠标指针位于其上的链接。:in-rangeinput:in-range选择其值在指定范围内的 input 元素。:indeterminateinput:indeterminate选择处于不确定状态的 input 元素。:invalidinput:invalid选择具有无效值的所有 input 元素。:lang(language)p:lang(it)选择 lang 属性等于 “it”意大利的每个 元素。:last-childp:last-child选择属于其父元素最后一个子元素每个 元素。:last-of-typep:last-of-type选择属于其父元素的最后 元素的每个 元素。:linka:link选择所有未访问过的链接。:not(selector):not§选择非 元素的每个元素。:nth-child(n)p:nth-child(2)选择属于其父元素的第二个子元素的每个 元素。:nth-last-child(n)p:nth-last-child(2)同上从最后一个子元素开始计数。:nth-of-type(n)p:nth-of-type(2)选择属于其父元素第二个 元素的每个 元素。:nth-last-of-type(n)p:nth-last-of-type(2)同上但是从最后一个子元素开始计数。:only-of-typep:only-of-type选择属于其父元素唯一的 元素的每个 元素。:only-childp:only-child选择属于其父元素的唯一子元素的每个 元素。:optionalinput:optional选择不带 “required” 属性的 input 元素。:out-of-rangeinput:out-of-range选择值超出指定范围的 input 元素。::placeholderinput::placeholder选择已规定 “placeholder” 属性的 input 元素。:read-onlyinput:read-only选择已规定 “readonly” 属性的 input 元素。:read-writeinput:read-write选择未规定 “readonly” 属性的 input 元素。:requiredinput:required选择已规定 “required” 属性的 input 元素。:root:root选择文档的根元素。::selection::selection选择用户已选取的元素部分。:target#news:target选择当前活动的 #news 元素。:validinput:valid选择带有有效值的所有 input 元素。:visiteda:visited选择所有已访问的链接。