目录
BeautifulSoup的使用
BeautifulSoup的下载安装
使用pip工具在DOS窗口进行下载安装,敲入命令:pip install bs4
BeautifulSoup的简单使用
data.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<h1>这是一个测试文件</h1>
</body>
</html>
python文件
from bs4 import BeautifulSoup
# 下载安装: pip install bs4
html = "<a href='#'>超链接</a>"
# 解析字符串形式的HTML
soup = BeautifulSoup(html, "lxml") # 第一个参数是要被解析的HTML字符串,第二个参数是固定的使用lxml
print(soup)
print("\n\n")
# 解析本地HTML文件
soup2 = BeautifulSoup(open("data.html", "rb"), "lxml")
# 格式化输出soup对象
print(soup2.prettify())
控制台打印:
<html><body><a href="#">超链接</a></body></html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>测试</title>
</head>
<body>
<h1>这是一个测试文件</h1>
</body>
</html>
获取标签信息
from bs4 import BeautifulSoup
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<h1>这是一个测试文件</h1>
<a href="http://www.baidu.com" class="red">百度</a>
</body>
</html>
"""
# 解析字符串HTML
soup = BeautifulSoup(html, "lxml")
# 根据标签名获取标签信息
# 语法:soup.tagName
# 其中soup是BeautifulSoup对象,tagName是标签名
print(soup.title)
print("------------------------------------------------")
# 获取标签内容
# 语法:soup.tagName.string
# 其中soup是BeautifulSoup对象,tagName是标签名,string是固定的获取标签内容
print(soup.title.string)
print("------------------------------------------------")
# 获取标签名
# 语法:soup.tagName.name
# 其中soup是BeautifulSoup对象,tagName是标签名,name是固定的获取标签名
print(soup.title.name)
print("------------------------------------------------")
# 获取标签内所有属性
# 语法:soup.tagName.attrs
# 其中soup是BeautifulSoup对象,tagName是标签名,attrs是固定的表示所有标签,返回一个字典
print(soup.a.attrs)
print("------------------------------------------------")
# 获取标签内的指定属性
# 语法:soup.tagName.attrs["attrName"]
# 其中soup是BeautifulSoup对象,tagName是标签名,attrs是固定的表示所有标签是一个字典,attrName表示需要获取的属性名
print(soup.a.attrs["href"])
print("------------------------------------------------")
# 获取直接的子标签,结果返回一个列表
# 语法:soup.tagName.contents
# 其中soup是BeautifulSoup对象,tagName是标签名,contents表示标签下的所有子标签返回一个列表
print(soup.body.contents)
print("------------------------------------------------")
# 获取直接的子标签,结果返回一个生成器
# 语法:soup.tagName.children
# 其中soup是BeautifulSoup对象,tagName是标签名,children表示标签下的所有子标签返回一个生成器
for i1 in soup.body.children:
print(i1)
print("------------------------------------------------")
# 获取所有的子标签,结果是一个生成器
# 语法:soup.descendants
# 其中soup是BeautifulSoup对象,descendants是固定的表示获取所有子标签返回一个生成器
for i2 in soup.descendants:
print(i2)
print("------------------------------------------------")
for i3 in soup.head.descendants:
print(i3)
print("------------------------------------------------")
控制台打印:
<title>测试</title>
------------------------------------------------
测试
------------------------------------------------
title
------------------------------------------------
{'href': 'http://www.baidu.com', 'class': ['red']}
------------------------------------------------
http://www.baidu.com
------------------------------------------------
['\n', <h1>这是一个测试文件</h1>, '\n', <a class="red" href="http://www.baidu.com">百度</a>, '\n']
------------------------------------------------
<h1>这是一个测试文件</h1>
<a class="red" href="http://www.baidu.com">百度</a>
------------------------------------------------
html
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>测试</title>
</head>
<body>
<h1>这是一个测试文件</h1>
<a class="red" href="http://www.baidu.com">百度</a>
</body>
</html>
<head>
<meta charset="utf-8"/>
<title>测试</title>
</head>
<meta charset="utf-8"/>
<title>测试</title>
测试
<body>
<h1>这是一个测试文件</h1>
<a class="red" href="http://www.baidu.com">百度</a>
</body>
<h1>这是一个测试文件</h1>
这是一个测试文件
<a class="red" href="http://www.baidu.com">百度</a>
百度
------------------------------------------------
<meta charset="utf-8"/>
<title>测试</title>
测试
------------------------------------------------
搜索文档树
import re
from bs4 import BeautifulSoup
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<h1 id="title">这是一个测试文件</h1>
<a href="http://www.baidu.com" class="red">百度</a>
</body>
</html>
"""
# 解析字符串HTML
soup = BeautifulSoup(html, "lxml")
# 根据字符串查找所有的a标签,返回一个结果集,里面是装的是标签对象
data = soup.find_all("a")
for i in data:
print(i.string)
print("--------------------------------------------")
# 根据正则表达式查找标签,匹配的是标签名
data2 = soup.find_all(re.compile("^b"))
for i2 in data2:
print(i2)
print("--------------------------------------------")
# 根据属性查找标签
data3 = soup.find_all(id="title")
for i3 in data3:
print(i3)
print("--------------------------------------------")
# text指定某个标签内容来获取标签内容
data4 = soup.find_all(text="百度")
print(data4)
print("--------------------------------------------")
# text指定标签内容列表来获取标签内容
data5 = soup.find_all(text=["测试", "百度"])
print(data5)
print("--------------------------------------------")
# text指定正则表达式来获取标签内容
data6 = soup.find_all(text=re.compile("度"))
print(data6)
print("--------------------------------------------")
控制台打印:
百度
--------------------------------------------
<body>
<h1 id="title">这是一个测试文件</h1>
<a class="red" href="http://www.baidu.com">百度</a>
</body>
--------------------------------------------
<h1 id="title">这是一个测试文件</h1>
--------------------------------------------
['百度']
--------------------------------------------
['测试', '百度']
--------------------------------------------
['百度']
--------------------------------------------
CSS选择器
from bs4 import BeautifulSoup
html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<h1 id="title">这是一个测试文件</h1>
<a href="http://www.baidu.com" class="red">百度</a>
</body>
</html>
"""
# 解析字符串HTML
soup = BeautifulSoup(html, "lxml")
# 通过标签名获取标签
data1 = soup.select("a")
print(data1[0].string)
print("------------------------------")
# 通过类名获取标签
data2 = soup.select(".red")
print(data2[0].string)
print("------------------------------")
# 通过ID名来获取标签
data3 = soup.select("#title")
print(data3[0].string)
print("------------------------------")
# 通过组合选择器来获取标签
data4 = soup.select("body .red")
print(data4[0].string)
print("------------------------------")
# 通过其他属性来查找
data5 = soup.select("h1[id='title']")
print(data5[0].string)
控制台打印:
百度
------------------------------
百度
------------------------------
这是一个测试文件
------------------------------
百度
------------------------------
这是一个测试文件