• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回python栏目

99 - 第三方库 - beautifulsoup4 - HTML解析库

作者:

贺及楼

成为作者

更新日期:2024-10-28 10:12:35

beautifulsoup4HTML解析库

beautifulsoup4库的简介

Python 的 BeautifulSoup4 库是一个用于解析HTML和XML文档的库。它能够从网页中提取数据,生成解析树,从而便于提取、修改和操作网页内容。BeautifulSoup4 提供了简单的方法来导航、搜索和修改解析树,支持多种解析器,如 html.parserlxml。它广泛应用于网页抓取、数据提取、内容分析等场景,是处理网络数据和实现网络爬虫的重要工具。

安装html解析库 beautifulsoup4

  1. pip install beautifulsoup4

安装beautifulsoup4

可以看见不仅仅安装了beautifulsoup4库还安装了soupsieve
Soupsieve 是一个现代的 CSS 选择器库,专为 Beautiful Soup 4 设计,用于在 Python 环境中使用现代 CSS 选择器进行选择、匹配和过滤 HTML 或 XML 文档 。

导入beautifulsoup4包

  1. from bs4 import BeautifulSoup

获得HTML

  1. html_doc = browser.page_source # 来自selenium的browser
  2. soup = BeautifulSoup(html_doc, 'html.parser')

多种解析HTML方式

解析器 构建一个BeautifulSoup对象 速度 优势 劣势
语法 soup = BeautifulSoup(解析内容,解析器) / / /
python标准库 soup = BeautifulSoup(html_doc, 'html.parser') 适中 Python的内置标准库 Python 2.7.3or 3.2.2)前的版本中文档容错能力差
lxml HTML 解析器 soup = BeautifulSoup(html_doc, 'lxml') 文档容错能力强 需要安装C语言库
lxml XML 解析器 soup = BeautifulSoup(html_doc, 'lxml-xml') 唯一支持XML的解析器 需要安装C语言库
lxml XML 解析器 soup = BeautifulSoup(html_doc, 'xml') 唯一支持XML的解析器 需要安装C语言库
html5lib soup = BeautifulSoup(html_doc, 'html5lib') 容错好、以浏览器的方式解析文档、生成HTML5格式 不依赖外部扩展
  1. 概念:2个类型
  2. <class 'bs4.element.ResultSet'>
  3. <class 'bs4.element.Tag'>

使用html解析库 beautifulsoup4例子

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>标题</title>
  6. </head>
  7. <body>
  8. <div id="div_data">
  9. <h1>我的第一个标题h1</h1>
  10. <p class="p_class">我的第一个段落。p</p>
  11. </div>
  12. <div>
  13. <a>第一个a标签</a>
  14. <a>第二个a标签</a>
  15. <p id="link1"></p>
  16. </div>
  17. </body>
  18. </html>

获得soup后方法

查改增删 方法 释义
soup.title 获取整个title标签字段 <title>标题</title>
soup.title.string 获取title标签的值 标题
soup.title.name 获取title标签名称 title
soup.title.parent.name 获取 title 的父级标签名称 head
soup.p 获取第一个p标签字段 <p class="p_class">我的第一个段落。p</p>
soup.p['class'] 获取第一个p中class属性值 ['p_class']
soup.p.get('class') 获取第一个p中class属性值 ['p_class']
soup.a 获取第一个a标签字段 <a>第一个a标签</a>
soup.find(id="link1") 获取属性id值为link1的字段 <p id="link1"></p>
soup.find_all('a') 获取所有a标签字段 [<a>第一个a标签</a>, <a>第二个a标签</a>]
soup.select("#div_data") [<div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div>]
soup.select("#div_data")[0] <div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div>
str(soup.select("#div_data")[0]) <div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div>
soup.a['class'] = "newClass" 可以对这些属性和内容等等进行修改
del soup.a['class'] 还可以对这个属性进行删除

<class 'bs4.element.ResultSet'>

  1. # 特征:
  2. # 有[]
  3. page_list = soup.select(".classname") # 获得class里的内容
  4. # page_list类型:<class 'bs4.element.ResultSet'>
  5. for a in page_list[0]: # 可以直接for,[0]是page_list是列表
  6. # 为了不用找来找去
  7. # 建议用这个取值方法
  8. data = a.find_all(name="div", attrs={"class": "class_name"})[0].string
  9. # find_all() # name参数填比较好,返回列表,标签之间的值
  10. # 去掉注释内容
  11. price = soup.find(name="div", attrs={"class": "class_name"})
  12. # price类型:<class 'bs4.element.Tag'>
  13. for element in price(text=lambda text: isinstance(text, Comment)):
  14. element.extract()
  15. price2 = price.string
  16. # 清空.clear()
  17. # 清除标签内的内容(包括子标签和文本)
  18. html = "<html><body><p><a></a></p></body></html>"
  19. soup.p.clear()
  20. # <html><body><p></p></body></html>
  21. # 清空.decompose()
  22. # 清除标签(包括该标签)的内容(包括子标签和文本)
  23. html = "<html><body><p><a></a></p></body></html>"
  24. soup.p.decompose()
  25. # <html><body></body></html>
  26. # 清空.extract()
  27. # 清除标签(包括该标签)的内容(包括子标签和文本)并返回
  28. # 同decompose,但是会返回删除的节点
  29. html = "<html><body><p><a></a></p></body></html>"
  30. p_extract = soup.p.extract()
  31. # <html><body></body></html>
  32. # p_extract:<p><a></a></p>

<class 'bs4.element.Tag'>

  1. # 特征
  2. # 无[]
  3. price = price.get_text() # 取值
  4. price = price["id"] # 属性值
  5. price = price["class"] # 属性值
  6. price = price["href"] # 属性值

https://blog.csdn.net/S_numb/article/details/120218188