06 BeautifulSoup4

2020年05月29日 137点热度 0人点赞 0条评论

6.1 Beautiful Soup 简介

6.1.1 概念

Beautiful Soup最主要的功能是在网页上抓取数据,可以从HTML或XML文件中解析提取到网页的数据,进行处理信息导航、搜索以及修改节点等功能。

6.1.2 bs4安装方式

可以通过pip命令进行安装:

pip install lxml
pip install bs4

模块导入方式:

from bs4 import Beautifulsoup

6.2 bs4的使用

6.2.1 Beautiful Soup 的基本使用
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""
# 获取bs对象
bs = BeautifulSoup(html_doc,'lxml')
print(bs.prettify())    # 打印文档内容(可以使标签更加美观,更加规范)
print(bs.title) # 获取title标签内容 Ex: <title>The Dormouse's story</title>
print(bs.title.name)    # 获取title标签名称 Ex: title
print(bs.title.string)  # 获取title文本内容 Ex: The Dormouse's story
print(bs.p) # 获取p段落

常用的搜索文档树:

  • find() 查找某个节点,返回搜索到的第一条数据
  • find_all() 查找所有相同的节点,返回所有标签数据,列表形式输出
bs.find('p')    # 搜索第一个p节点数据
bs.find_all('p')    # 搜索所有p节点的数据,并返回列表形式输出
6.2.2 bs4 的对象种类
  • tag:标签
  • NavigableString:可导航的字符串
  • BeautifulSoup:bs对象
  • Comment:注释
# tag 标签
print(type(bs.a))   # a标签的对象 <class 'bs4.element.Tag'>

# NavigableString 可导航的字符串,如:通过p标签导航
print(type(bs.p.string))    # <class 'bs4.element.NavigableString'>

# Comment 注释
html_comment = '<a><!-- 这里是注释内容 --></a>'
bs = BeautifulSoup(html_comment,'lxml')
print(type(bs.a.string))    # <class 'bs4.element.Comment'>

6.3 遍历文档树 子节点

遍历文档树三种情况:遍历,查找,修改

6.3.1 content children descendants
  • contents 返回的是一个列表
  • children 返回的是一个迭代器,通过迭代器可以进行迭代
  • descendants 返回的是一个生成器,遍历子子孙孙
links = bs.div.contents # 返回列表
print(type(links))

links2 = bs.div.children    # 返回迭代器
print(type(links2)) # <class 'list_iterator'>

for x in bs.descendants:    # 返回生成器,遍历子子孙孙
    print('---------------')
    print(x)
6.3.2 .string .strings .stripped strings
  • string 获取标签里的内容
  • strings 返回一个生成器的对象,用来获取更多的标签
  • stripped strings 和 strings 基本一致,特别之处是可以把多余的空格给去除
# 获取title里标签的内容
title_tag = bs.title
print(title_tag.string)

# 返回生成器对象
print(bs.strings) # <generator object _all_strings at 0x000001D9053745C8>

# 把多余的空格去除
strings = soup.stripped_strings
for s in strings:
    print(s)

6.4 遍历文档树 父节点

6.4.1 parent 和 parents
  • parent 直接获得父节点
  • parents 获取所有的父节点
# parent 获取父节点
print(bs.a.parent) # 第一条数据获得父节点

# parents 获取所有父节点
a_tag = bs.a
for x in a_tag.parents:
    print(x)
    print('-------------')

6.5 遍历文档树 遍历兄弟节点

  • next_sibling 下一个兄弟节点
  • previous_sibling 上一个兄弟节点
  • next_siblings 下一个所有兄弟节点
  • previous_siblings 上一个所有兄弟节点

6.6 搜索树

  • 字符串过滤器
  • 正则表达式过滤器
    • 我们用正则表达式里面compile方法编译一个正则表达式传给 find 或者 findall这个方法可以实现一个正则表达式的一个过滤器的搜索
  • 列表过滤器
  • True过滤器
  • 方法过滤器

6.7 find_all 和 find()

6.7.1 find_all()
  • find_all() 方法以列表形式返回所有的搜索到的标签数据
  • find() 方法返回搜索到的第一条数据‘
  • find_all() 方法参数如下:
def find_all(self, name=None, attrs={}, recursive=True, text=None,
                 limit=None, **kwargs):
  • name = tag名称
  • attr = 标签的属性
  • recursive = 是否递归搜索
  • text = 文本内容
  • limli = 限制返回条数
  • kwargs = 关键字参数
6.7.2 find兄弟节点
  • find_parentes() 搜索所有父亲
  • find_parent() 搜索单个父亲
  • find_next_siblings() 搜索所有兄弟
  • find_next_sibling() 搜索单个兄弟
  • find_previous_siblings() 往上搜索所有兄弟
  • find_prebious_sibling() 往上搜索单个兄弟
  • find_all_next() 往下搜索所有元素
  • find_next() 往下查找单个元素
6.7.3 修改文档树
  • 修改tag的名称和属性
tag_p = bs.p
print(tag_p)
>>> <p class="title"><b>The Dormouse's Stiry</b></P>

tag_p.name = 'w' # 修改名称
tag_p['class'] = 'content' # 修改属性
print(tag_p)
>>> <w class="content"><b>The Dormouse's Stiry</b></w>
  • 修改string 属性赋值,当前的内容替代了原来的内容
  • append() 像tag中增加内容,就像python的列表append() 方法一样
  • docompose() 修改删除段落,把不要的文章段落给删除

YenYoong☕

当你能梦的时候就不要放弃梦~😎

文章评论