python爬虫(三)------bs4库(一)------BeautifulSoup()和Tag对象的各种方法
python爬虫(三)------bs4库(一)------BeautifulSoup()和Tag对象的各种方法
·
python爬虫(二)------requests模块及其常用方法-get()、post()
- 安装
pip install bs4
-
BeautifulSoup(参数一,解释器类型):解释器类型包含:“lxml”, “html5lib”, 和 “html.parser”
-
Tag 对象 ,他与XML或HTML原生文档中的tag相同,获取方法:tag = BeautifulSoup(…).标签名, BeautifulSoup(…).header, BeautifulSoup(…).body, BeautifulSoup(…).div, BeautifulSoup(…).a,BeautifulSoup(…).p 等等
(1)Tag对象的属性
名称 | 解释 |
---|---|
tag.name | 获取Tag对象的标签名 |
tag.name = ‘值’ | 修改Tag的标签名 |
tag.text | 获取标签的内容 |
tag.string | 获取标签的内容,可以遍历输出文字内容,只能在tag里面只有一个节点时候才可以使用 |
tag.string = ‘内容’ | 修改标签的内容,会覆盖掉原有的所有内容包括子tag |
tag.strings | 如果tag中包含多个字符串 ,可以使用strings来循环获取 |
tag.stripped_strings | 去除多余空白内容,全部是空格的行会被忽略掉,段首和段末的空白会被删除 |
tag[‘属性名’] | 获取属性值 |
tag[‘属性名’] = ‘值’ | 修改某个属性值 |
tag.attrs | 获取该标签的全部属性 |
del tag[‘属性名’] | 删除某个属性 |
tag[‘属性名’] = [‘属性值1’,‘属性值2’] | 给某个属性赋予多个值 |
tag.contents | 返回列表形式的子节点,不包括孙子节点 |
tag.children | 返回迭代器的列表对象,可以循环输出,不包括孙子节点 |
tag.descendants | 返回可迭代的对象,可以循环输出,包括孙子节点 |
tag.parent | 获取紧挨着的一个父节点 |
tag.parents | 获取全部的父辈节点 |
tag.next_sibling | 获取后面的紧挨着的一个兄弟节点 |
tag.next_siblings | 获取后面的全部兄弟节点,可以迭代输出 |
tag.previous_sibling | 获取前面的紧挨着的一个兄弟节点 |
tag.previous_siblings | 获取前面的全部兄弟节点,可以迭代输出 |
tag.next_element | 指向解析过程中下一个被解析的对象(字符串或tag) |
tag.next_elements | 指向解析过程中下面全部被解析的对象(字符串或tag) |
tag.previous_element | 指向解析过程中前一个被解析的对象(字符串或tag) |
tag.previous_elements | 指向解析过程中前面全部被解析的对象(字符串或tag) |
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<a href = 'aaa.com' class = 'aa'>超链接</a>","html.parser")
>>> tag = soup.a # 获取Tag对象
>>> tag
<a class="aa" href="aaa.com">超链接</a>
>>> tag.name
'a'
>>> tag.name = 'div'
>>> tag
<div class="aa" href="aaa.com">超链接</div>
>>> tag.text
'超链接'
>>> tag['href']
'aaa.com'
>>> tag['class']
['aa']
>>> tag['class'] = "d1"
>>> tag
<div class="d1" href="aaa.com">超链接</div>
>>> tag.attrs
{'href': 'aaa.com', 'class': ['aa']}
>>> del tag['href']
>>> tag
<div class="d1">超链接</div>
>>> tag['class'] = ['d1','aa']
>>> tag
<div class="d1 aa">超链接</div>
>>> tag.string
'超链接'
>>> for i in tag.string:
... print(i)
...
超
链
接
>>> soup.div.string = '我'
>>> soup.div.string
'我'
>>> html = """
<div class = 'parent'>
<div class = 'children1'>
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>
<div class = 'children2'>
<p>我是children12下面的p</p>
</div>
<div class = 'children3'>
<p>我是children3下面的p</p>
</div>
</div>
"""
>>> soup = BeautifulSoup(html,"html.parser")
>>> soup.div.contents
['\n', <div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>, '\n', <div class="children2">
<p>我是children12下面的p</p>
</div>, '\n', <div class="children3">
<p>我是children3下面的p</p>
</div>, '\n']
>>> soup.div.children
<list_iterator object at 0x0000013579B724C8>
>>> for i in soup.div.children:
... print(i)
...
<div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>
<div class="children2">
<p>我是children12下面的p</p>
</div>
<div class="children3">
<p>我是children3下面的p</p>
</div>
>>> len(soup.div.contents)
7
>>> len(list(soup.div.children))
7
>>> soup.div.descendants
<generator object Tag.descendants at 0x0000013579BD0B48>
>>> len(list(soup.div.descendants))
25
>>> print(list(soup.div.descendants))
['\n', <div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>, '\n', <p>我是children1下面的p1</p>, '我是children1下面的p1', '\n', <p>我是children1下面的p2</p>, '我是children1 下面的p2', '\n', <p>我是children1下面的p3</p>, '我是children1下面的p3', '\n', '\n', <div class="children2">
<p>我是children12下面的p</p>
</div>, '\n', <p>我是children12下面的p</p>, '我是children12下面的p', '\n', '\n', <div class="children3">
<p>我是children3下面的p</p>
</div>, '\n', <p>我是children3下面的p</p>, '我是children3下面的p', '\n', '\n']
>>> soup.p.parent
<div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>
>>> soup.p.parents
<generator object PageElement.parents at 0x0000013579BD0B48>
>>> list(soup.p.parents)
[<div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>, <div class="parent">
<div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>
<div class="children2">
<p>我是children12下面的p</p>
</div>
<div class="children3">
<p>我是children3下面的p</p>
</div>
</div>,
<div class="parent">
<div class="children1">
<p>我是children1下面的p1</p>
<p>我是children1下面的p2</p>
<p>我是children1下面的p3</p>
</div>
<div class="children2">
<p>我是children12下面的p</p>
</div>
<div class="children3">
<p>我是children3下面的p</p>
</div>
</div>
]
# 其他属性都是类似的
(2)Tag对象的方法
名称 | 解释 |
---|---|
tag.string.replace_with(“内容”) | 替换标签的内容 |
tag.get(“属性名”) | 获取某个属性值 |
tag.append() | 在当前标签内部的最后面添加 |
BeautifulSoup.new_tag(标签名,属性) | 创建一个新的标签(标签属性可以省略),可以通过append添加进入 |
tag.insert() | 在当前标签内部添加 |
tag.insert_before() | 在当前tag或文本节点前插入内容 |
tag.insert_after() | 在当前tag或文本节点后插入内容 |
tag.clear() | 移除当前tag的内容 |
tag.extract() | 将当前tag移除文档树,并作为方法结果返回 |
tag.decompose() | 将当前节点移除文档树并完全销毁 |
tag.wrap() | 对指定的tag元素进行包装,并返回包装后的结果 |
tag.unwrap() | 移除tag内的所有tag标签,该方法常被用来进行标记的解包 |
BeautifulSoup或者tag.prettify() | 将Beautiful Soup的文档树格式化后以Unicode编码输出,每个XML/HTML标签都独占一行 |
BeautifulSoup或者tag.get_text() | 获取到tag中包含的所有文本内容包括子孙tag中的内容,并将结果作为Unicode字符串返回 |
soup.get_text(“|”, strip=True) | 第一个参数表示用什么符号分割多个子孙节点,第二个参数表示去除前后空白 |
BeautifulSoup或者tag.stripped_strings | [text for text in soup.stripped_strings]获取内容列表 |
>>> from bs4 import BeautifulSoup
>>> html = """
<div class = 'd1'>
<p>我是p标签</p>
</div>
"""
>>> soup = BeautifulSoup(html,'html.parser')
>>> soup.div.get("class")
['d1']
>>> soup.p.string
'我是p标签'
>>> soup.p.string.replace_with("替换了")
'我是p标签'
>>> soup.p.string
'替换了'
>>> soup.p.append("添加了")
>>> soup.p
<p>替换了添加了</p>
>>> soup.div.insert(1,"<a href = 'aa.com'>a标签添加</a>")
>>> soup.div
<div class="d1">
<a href = 'aa.com'>a标签添加</a><p>替换了添加了</p>
</div>
>>> create_tag = soup.new_tag("<a href = 'aa.com'>a标签创建添加</a>")
>>> soup.div.append(create_tag)
>>> soup.div
<div class="d1">
<a href = 'aa.com'>a标签添加</a><p>替换了添加了</p>
<<a href = 'aa.com'>a标签创建添加</a>></<a href = 'aa.com'>a标签创建添加</a>></div>
>>> html = """
<div class = 'd1'>
<p>我是p标签</p>
</div>
"""
>>> soup = BeautifulSoup(html,'html.parser')
>>> soup.p.clear()
>>> soup.div
<div class="d1">
<p></p>
</div>
>>> soup.p.insert_before("前面")
>>> soup.div
<div class="d1">
前面<p></p>
</div>
>>> soup.p.insert_after("后面")
>>> soup.div
<div class="d1">
前面<p></p>后面
</div>
>>> soup.p.insert(1,"insert")
>>> soup.div
<div class="d1">
前面<p>insert</p>后面
</div>
>>> soup.div.get_text()
"\n前面insert后面\n"
>>> soup.div.get_text("|")
"\n|前面|insert|后面|\n"
>>> soup.div.get_text("|",strip = True)
"前面|insert|后面"
>>> [text for text in soup.div.stripped_strings]
['前面', 'insert', '后面']
>>> html = """
<div class = 'd1'>
<p>我是p标签</p>
</div>
"""
>>> soup = BeautifulSoup(html,'html.parser')
>>> soup.p
<p>我是p标签</p>
>>> soup.p.string.wrap(soup.new_tag("a"))
<a>我是p标签</a>
>>> soup
<div class="d1">
<p><a>我是p标签</a></p>
</div>
>>> soup.a.unwrap()
<a></a>
>>> soup
<div class="d1">
<p>我是p标签</p>
</div>
>>> print(soup.prettify())
<div class="d1">
<p>
我是p标签
</p>
</div>
>>> soup.p.extract()
<p>我是p标签</p>
>>> soup
<div class="d1">
</div>
>>> soup.div.decompose()
>>> soup
python爬虫(四)------bs4库(二)------BeautifulSoup的findall()、find(()、select()和select_one()等方法

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)