Python爬虫信息处理之二BeautifulSoup库

举报
tea_year 发表于 2024/06/19 09:23:01 2024/06/19
【摘要】 BeautifulSoup 是一个用于从HTML和XML文件中提取数据的Python库。它提供了简单的方式来处理浏览器标记。一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.这篇文档介绍了BeautifulSoup4中所有主要特性,并且有小例子.让我来向你...
BeautifulSoup 是一个用于从HTML和XML文件中提取数据的Python库。它提供了简单的方式来处理浏览器标记。
一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

这篇文档介绍了BeautifulSoup4中所有主要特性,并且有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.

  1. 安装 bs4
pip install bs4
     2.导入库
from bs4 import BeautifulSoup
      3.获取网页内容
      4.解析 HTML
      5.查找元素
案例:请使用BeautifulSoup解析以下网页内容
      
<!DOCTYPE html>
<html>
<head>
    <meta content="text/html;charset=utf-8" http-equiv="content-type" />
    <meta content="IE=Edge" http-equiv="X-UA-Compatible" />
    <meta content="always" name="referrer" />
    <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css" />
    <title>百度一下,你就知道 </title>
</head>
<body link="#0000cc">
  <div id="wrapper">
    <div id="head">
        <div class="head_wrapper">
          <div id="u1">
            <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
            <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
            <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>
            <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>
            <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>
            <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>
            <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品 </a>
          </div>
        </div>
    </div>
  </div>
</body>
</html>

    

1.Tag(标签)

        Tag 对象表示 HTML 或 XML 中的标签,例如<div>、<p>、<a>等,Tag对象可 以包含其他标签、文本内容和属性,是BeautifulSoup中最常用的对象类型。
2.NavigableString(可导航字符串)

        NavigableString 对象表示 HTML 或 XML 中的文本内容。它是标签内部的文本部分,可以通过 Tag 对象的 .string 属性或 .get_text() 方法获取。NavigableString 对象具有字符串的特性,可以进行各种字符串操作。
3.BeautifulSoup

        BeautifulSoup 对象是整个文档的表示。它由解析器解析 HTML 或 XML 文件得到,并提供了对整个文档的遍历、搜索和修改功能。BeautifulSoup 对象是使用 BeautifulSoup 构造函数创建的,通常将解析器的名称和要解析的文档作为参数传递给构造函数。
4.Comment(注释)

        Comment 对象表示 HTML 或 XML 中的注释部分。它是一种特殊的 NavigableString 对象,可以通过 Tag 对象的 .string 属性或 .get_text() 方法获取。注释部分在解析文档时通常会被忽略,但在需要时可以提取和处理。

        这些对象类型在 BeautifulSoup 中相互关联,共同构成了对 HTML 或 XML 文档的完整表示和操作方式。
————————————————

#导入类库文件
from bs4 import BeautifulSoup

#io文件操作的方式
#file是读取baidu页面的对象(变量)
file=open('baidu.html','rb')
#html是一个变量
html=file.read().decode('utf-8')
# print(html)  测试 创建一个BeautifulSoup对象。这个对象可以解析HTML或XML文档,并提供了方便的方法来搜索、修改和遍历文档树
bs=BeautifulSoup(html,'html.parser')

# 一 输出 解析的内容,随便测试
# print(bs)   #所有的文档
# print(bs.head)        #head
# print(bs.title)         #标题

# 二.四种类型Tag NavigableString bs  Comment
# 2.1 bs4.element.Tag:标签类型
# print(type(bs.title))

# 2.2 bs4.element.NavigableString HTML或XML文档中的文本内容。NavigableString对象可以像字符串一样进行操作
# print(bs.title.string)  #title里面的字符串
# print(type(bs.title.string))

#2.3 bs4.BeautifulSoup 文档类型
# print(type(bs))

#2.4 bs4.element.Comment 注释
print(bs.a)  #有多个同名标签的时候,只出来第一个
print(bs.a.string)  # 解析注释
print(type(bs.a.string))

在BeautifulSoup有3中常用解析器类型:
1.html.parser

        这是 Python 内置的解析器,不需要额外安装任何库。它通常是使用 BeautifulSoup 的默认解析器。但是它在处理某些复杂的 HTML 文档时可能表现不佳。
2.lxml

        lxml 是一个高性能的解析库,要使用 lxml 解析器,需要先安装 lxml 库。可以使用 pip install lxml 命令进行安装。lxml 解析器通常比内置的 html.parser 解析器更快,而且能够处理一些复杂的 HTML 结构。
3.html5lib

        html5lib 解析器是一个纯 Python 实现的解析器,它以与浏览器一致的方式解析 HTML。要使用 html5lib 解析器,需要先安装 html5lib 库。可以使用 pip install html5lib 命令进行安装。html5lib 解析器通常比内置的 html.parser 解析器慢,但它具有更好的容错性,可以处理包含错误或不完整的 HTML。

        一般情况下,如果只是进行基本的 HTML 解析,内置的 html.parser 解析器已经足够。如果需要处理复杂的 HTML 结构或需要更好的性能,可以考虑使用 lxml 解析器。如果需要处理包含错误或不完整的 HTML,可以尝试使用 html5lib 解析器。

对文档内容进行查找的五种方式

    #Beautiful Soup库中的find_all()方法是用于查找HTML文档中符合指定条件的所有元素。它返回一个列表,其中包含了找到的所有元素。

# 对于Beautiful Soup库中的find_all()方法,其参数类型可以分为以下几种:
# 标签名:字符串类型,用于选择指定标签名的元素。例如:'p'、'a'等。
# 属性名:字符串类型,用于选择具有指定属性的元素。例如:'class'、'id'等。
# 属性值:可以是字符串或正则表达式,用于选择具有指定属性值的元素。可以使用字典形式传递,例如{'class': 'intro'}表示选择具有class属性且属性值为'intro'的元素;也可以使用正则表达式,例如{'href': '^https://'}表示选择href属性以https://开头的元素。

# find_all()方法的基本语法如下:
# find_all(name, attrs, recursive, string, limit, **kwargs)
# 参数说明:
# name:可选参数,用于指定要查找的标签名。
# attrs:可选参数,用于指定要查找的元素的属性或属性值。可以是一个字典或关键字参数形式。例如,attrs={'class': 'intro'} 或 class_='intro'。
# recursive:可选参数,表示是否递归查找,默认为True,即在所有子孙节点中查找。soup.find_all('p', recursive=False)
# string:可选参数,用于指定要查找的元素的文本内容。soup.find_all('p', string='This is a regular paragraph.')
# limit:可选参数,用于限制返回的结果数量。 soup.find_all('p', class_='intro', limit=2)
# **kwargs:关键字参数形式的属性查找,例如 id='my-id'
# find_all()方法还支持传递任意的关键字参数来指定其他属性的查询条件。这些额外的关键字参数将被视为要匹配的元素的属性名和属性值。
# 例如,如果要查找所有具有id属性且id属性值为"content"的元素,可以使用以下方式:
# elements = soup.find_all(id='content')
# 同样,如果要查找所有具有data-custom属性且属性值为"123"的元素,可以使用以下方式:
# elements = soup.find_all(attrs={'data-custom': '123'})
# 提示: 参数名class后面添加下划线_是因为class是Python中的保留关键字。

#导入类库文件
from bs4 import BeautifulSoup

#io文件操作的方式
#file是读取baidu页面的对象(变量)
file=open('baidu.html','rb')
#html是一个变量
html=file.read().decode('utf-8')
# print(html)  测试 创建一个BeautifulSoup对象。这个对象可以解析HTML或XML文档,并提供了方便的方法来搜索、修改和遍历文档树
bs=BeautifulSoup(html,'html.parser')


# 文档的查找:find_all
# 1.文档标签的查找;查找的所有的a标签
t_list=bs.find_all('a')
# print(t_list)
# 2.kwargs参数
# t_list=bs.find_all(id='head')
# t_list=bs.find_all(class_=True)  # class_=False

# 3.string参数,之前text参数
# t_list=bs.find_all(string='hao123')
t_list=bs.find_all(string=['贴吧','360','2345','hao123'])

# 4.limit参数:限定前几条数据;
t_list=bs.find_all('a',limit=2)

# 5.选择器方式
t_list=bs.select('title')  #查找标签选择器是title的元素
t_list=bs.select('.mnav')   #类别选择器格式:.类别名
t_list=bs.select('#wrapper') #id选择器加#

t_list=bs.select('a[class=bri]')  #标签 属性选择器
t_list=bs.select('head>title')   #父元素>子元素
t_list=bs.select('.mnav ~ .bri') #.mnavl的兄弟出来了;作业:如何来找到.mnav他爹的兄弟?
#统一的遍历,放下面
for item in t_list:
    print(item)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。