赞
踩
活动地址:CSDN21天学习挑战赛
BeautifulSoup4是爬虫必学,BeautifulSoup功能是从网页抓取数据,BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf8。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器。
BeautifulSoup4是一个HTML/XML的解析器,主要功能是如何解析和提取 HTML/XML 数据。
pip install beautifulsoup4
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup,“html.parser”) | 1)Python的内置标准库 2)执行速度适中 3)文档容错能力强 | Python 2.7.3 or 3.2.2)前的 版本中文档容错能力差 |
html5lib | BeautifulSoup(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"))
结果:
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
注意:查找方式是所有内容中的第一个符合要求的标签
Tag通俗点讲就是HTML中的一个个标签。
soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')
tag = soup.ul
print(tag)
print(type(tag))
如果拿到标签后,还想获取标签中的内容。那么可以通过tag.string获取标签中的文字
from bs4 import BeautifulSoup
soup = BeautifulSoup('<ul class="list">Flink</ul>', 'lxml')
tag = soup.ul
# 直接获取标签内的文字
print(soup.ul.string)
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)
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))
BS4 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。Beautiful Soup 提供了一个 select() 方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容
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'))
结果:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。