当前位置:   article > 正文

Python 解析器BeautifulSoup4_python beautifulsoup4

python beautifulsoup4


活动地址:CSDN21天学习挑战赛

一、安装BeautifulSoup4

BeautifulSoup4是爬虫必学,BeautifulSoup功能是从网页抓取数据,BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf8。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器。

1、BeautifulSoup4简介

BeautifulSoup4是一个HTML/XML的解析器,主要功能是如何解析和提取 HTML/XML 数据。

2、安装BeautifulSoup

pip install beautifulsoup4
  • 1

在这里插入图片描述

3、四种解析器的优缺点

解析器使用方法优势劣势
Python标准库BeautifulSoup(markup,“html.parser”) 1)Python的内置标准库
2)执行速度适中
3)文档容错能力强
Python 2.7.3 or 3.2.2)前的
版本中文档容错能力差
html5libBeautifulSoup(markup,“html5lib”) 1)最好的容错性
2)以浏览器的方式解析文档
3)生成HTML5格式的文档
1)速度慢
2)不依赖外部扩展
lxml HTML 解析器BeautifulSoup(markup,“lxml”) 1)速度快
2)文档容错能力强
需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup,[“lxml-xml”]) 1)速度快
2)唯一支持XML的解析器
需要安装C语言库

​## 4、实例演示
在这里插入图片描述

from bs4 import BeautifulSoup
html = """
<div class="panel">
    <div class="heading">
        <h1>HelloWorld</h1>
    </div>
    <div class="body">
        <ul class="list" id="list1" name="element">
            <li class="element">Flink</li>
            <li class="element">Spark</li>
            <li class="element">Hadoop</li>
            <li class="element">Kafka</li>
        </ul>
        <ul class="list-small" id="list2">
            <li class="element">Flink</li>
                <a href="https://tianlingqun.blog.csdn.net/">我的博客</a>
            <li class="element">Hadoop</li>
        </ul>
    </div>
</div> 
"""
# 创建对象
soup = BeautifulSoup(html, 'lxml')
# 格式化输出
print(soup.prettify())
# 获取div标签的所有内容
print(soup.div)
# 获取标签的名字
print(soup.div.name)
# 获取标签class值
print(soup.div["class"])
# 获取标签文本内容
print(soup.li.string)
# 获取li所有标签
print(soup.findAll("li"))
# 获取id="list1"所有值
print(soup.find(id="list1"))
# 遍历li标签,打印所有class的值
for item in soup.findAll("li"):
    print(item.get_text("class"))
# 遍历a标签,打印href的值
for item in soup.findAll("a"):
    print(item.get("href"))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

结果:

D:\python383\python.exe D:/pythonproject/csdn/RequestsDemo.py
<html>
 <body>
  <div class="panel">
   <div class="heading">
    <h1>
     HelloWorld
    </h1>
   </div>
   <div class="body">
    <ul class="list" id="list1" name="element">
     <li class="element">
      Flink
     </li>
     <li class="element">
      Spark
     </li>
     <li class="element">
      Hadoop
     </li>
     <li class="element">
      Kafka
     </li>
    </ul>
    <ul class="list-small" id="list2">
     <li class="element">
      Flink
     </li>
     <a href="https://tianlingqun.blog.csdn.net/">
      我的博客
     </a>
     <li class="element">
      Hadoop
     </li>
    </ul>
   </div>
  </div>
 </body>
</html>
======================================== 分隔符 ========================================
<div class="panel">
<div class="heading">
<h1>HelloWorld</h1>
</div>
<div class="body">
<ul class="list" id="list1" name="element">
<li class="element">Flink</li>
<li class="element">Spark</li>
<li class="element">Hadoop</li>
<li class="element">Kafka</li>
</ul>
<ul class="list-small" id="list2">
<li class="element">Flink</li>
<a href="https://tianlingqun.blog.csdn.net/">我的博客</a>
<li class="element">Hadoop</li>
</ul>
</div>
</div>
======================================== 分隔符 ========================================
div
======================================== 分隔符 ========================================
['panel']
======================================== 分隔符 ========================================
Flink
======================================== 分隔符 ========================================
[<li class="element">Flink</li>, <li class="element">Spark</li>, <li class="element">Hadoop</li>, <li class="element">Kafka</li>, <li class="element">Flink</li>, <li class="element">Hadoop</li>]
======================================== 分隔符 ========================================
<ul class="list" id="list1" name="element">
<li class="element">Flink</li>
<li class="element">Spark</li>
<li class="element">Hadoop</li>
<li class="element">Kafka</li>
</ul>
======================================== 分隔符 ========================================
Flink
Spark
Hadoop
Kafka
Flink
Hadoop
======================================== 分隔符 ========================================
https://tianlingqun.blog.csdn.net/

Process finished with exit code 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

4、四种常见对象

1)Tag:

注意:查找方式是所有内容中的第一个符合要求的标签

Tag通俗点讲就是HTML中的一个个标签。
在这里插入图片描述

soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')
tag = soup.ul
print(tag)
print(type(tag))
  • 1
  • 2
  • 3
  • 4

2)NavigableString:

如果拿到标签后,还想获取标签中的内容。那么可以通过tag.string获取标签中的文字

在这里插入图片描述

from bs4 import BeautifulSoup
soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')
tag = soup.ul
# 直接获取标签内的文字
print(soup.ul.string)
  • 1
  • 2
  • 3
  • 4
  • 5

3)BeautifulSoup:

BeautifulSoup对象表示的是一个文档的全部内容,大部分时间可以把它当做Tag对象,它支持遍历文档树和搜索文档树中描述的大部分方法

在这里插入图片描述

from bs4 import BeautifulSoup
soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')

# 获取类型
print(type(soup.name))
# 获取属性  文档本身属性为null
print(soup.attrs)
# 获取名称
print(soup.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4)Comment:

Tag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象,容易让人担心的内容是文档的注释部分Comment对象是一个特殊类型的NavigableString对象
在这里插入图片描述

from bs4 import BeautifulSoup
soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')

print(soup.ul)
print(soup.ul.string)
print(type(soup.ul.string))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、CSS选择器

BS4 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。Beautiful Soup 提供了一个 select() 方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容

1、实战

在这里插入图片描述

from bs4 import BeautifulSoup

html = """
<html><head><title>Python教学</title></head>
<div class="panel">
    <div class="heading">
        <h1>HelloWorld</h1>
    </div>
    <div class="body">
        <ul class="list" id="list1" name="element">
            <li class="element">Flink</li>
            <li class="element">Spark</li>
            <li class="element">Hadoop</li>
            <li class="element">Kafka</li>
        </ul>
        <ul class="list-small" id="list2">
            <li class="element">Flink</li>
                <a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
            <li class="element">Hadoop</li>
        </ul>
    </div>
</div> 
"""
# 创建对象
soup = BeautifulSoup(html, 'lxml')
# 根据li标签查找
print(soup.select("li"))
# 根据类名查找
print(soup.select(".list"))
# 根据id查找
print(soup.select("#list2"))
# 根据属性选择器查找
print(soup.select("a[href]"))
# 后代节点查找
print(soup.select('html head title'))
# 标签+类或id组合形式  id位list2 标签为ul
print(soup.select("ul#list2"))
# 标签+类或id组合形式  class为list-small 标签为ul
print(soup.select("ul.list-small"))
# 查找兄弟节点
print(soup.select('li + a'))
# 查找子节点  2种结果一样
print(soup.select('ul  a'))
print(soup.select('ul > a'))
# 查找孙子节点 2种结果一样
print(soup.select('.list-small  #link'))
print(soup.select('.list-small > #link'))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

结果:

D:\python383\python.exe D:/pythonproject/csdn/RequestsDemo.py
[<li class="element">Flink</li>, <li class="element">Spark</li>, <li class="element">Hadoop</li>, <li class="element">Kafka</li>, <li class="element">Flink</li>, <li class="element">Hadoop</li>]
========================================	分割线	========================================
[<ul class="list" id="list1" name="element">
<li class="element">Flink</li>
<li class="element">Spark</li>
<li class="element">Hadoop</li>
<li class="element">Kafka</li>
</ul>]
========================================	分割线	========================================
[<ul class="list-small" id="list2">
<li class="element">Flink</li>
<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
<li class="element">Hadoop</li>
</ul>]
========================================	分割线	========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
========================================	分割线	========================================
[<title>Python教学</title>]
========================================	分割线	========================================
[<ul class="list-small" id="list2">
<li class="element">Flink</li>
<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
<li class="element">Hadoop</li>
</ul>]
========================================	分割线	========================================
[<ul class="list-small" id="list2">
<li class="element">Flink</li>
<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
<li class="element">Hadoop</li>
</ul>]
========================================	分割线	========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
========================================	分割线	========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
========================================	分割线	========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
========================================
[<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]

Process finished with exit code 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/140403
推荐阅读
相关标签
  

闽ICP备14008679号