BeautifulSoup用于html文件解析
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:TagNavigableStringBeautifulSoupComment测试文件:baidu.html请将文件内容放于项目的根目录下文件内容<!DOCTYPE html><html><head><meta content="te
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
测试文件:baidu.html
请将文件内容放于项目的根目录下
文件内容
<!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/5eN1bjq8AAUVYm2zgY3K/r/ww/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="...">更多产品</a>
</div>
</div>
</div>
</div>
</body>
</html>
文件在浏览器中打开的截图:
化html文件为树形结构bs
1.Tag 标签及其内容:拿到它所找到的第一个内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.title)
<title>百度一下,你就知道</title>
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.a)
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.head)
<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/5eN1bjq8AAUVYm2zgY3K/r/ww/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道</title>
</head>
类型
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(type(bs.head))
<class 'bs4.element.Tag'>
2.NavigableString 标签里面的内容(字符串)
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.title)
print(bs.title.string)
print(type(bs.title.string))
<title>百度一下,你就知道</title>
百度一下,你就知道
<class 'bs4.element.NavigableString'>
拿到一个标签里面所有的属性(字典)
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.a.attrs)
{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}
3.BeautifulSoup 表示整个文档
类型
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(type(bs))
<class 'bs4.BeautifulSoup'>
名字
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.name)
[document]
树形文档
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs)
<!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/5eN1bjq8AAUVYm2zgY3K/r/ww/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="...">更多产品</a> </div> </div> </div> </div> </body> </html>
4.Comment 是一个特殊的NacigableString,输出的内容不包含注释符号
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read()
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.a.string)
print(type(bs.a.string))
新闻
<class 'bs4.element.Comment'>
文档的遍历
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8")
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.head.contents)
['\n', <meta content="text/html;charset=utf-8" http-equiv="content-type"/>, '\n', <meta content="IE=Edge" http-equiv="X-UA-Compatible"/>, '\n', <meta content="always" name="referrer"/>, '\n', <link href="https://ss1.bdstatic.com/5eN1bjq8AAUVYm2zgY3K/r/ww/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>, '\n', <title>百度一下,你就知道</title>, '\n']
得到列表,可以用下标来访问相关的元素
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8")
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
print(bs.head.contents[1])
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
遍历文档树
- 5.1 .contents:获取Tag的所有子节点,返回一个list
# tag的.content属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
#用列表索引来获取它的某一个元素
print(bs.head.contents[1])
- 5.2 .children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
- 5.3、.descendants:获取Tag的所有子孙节点
- 5.4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
- 5.5、.stripped_strings: 与strings用法一致,只不过可以去除掉那些多余的空白内容
- 5.6、.parent:获取Tag的父节点
- 5.7、.parents:递归得到父辈元素的所有节点,返回一个生成器
- 5.8、.previous_sibling: 获取当前Tag的上一T个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
- 5.9、.next_sibling: 获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
- 5.10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器
- 5.11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器
- 5.12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的
- 5.13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的
- 5.14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容
- 5.15、.next_elements:返回一个生成器,可以向后访问文档的解析内容
- 5.16、.has_attr:判断Tag是否包含属性
文档的搜索
(1)find_all() 字符串过滤:会查找与字符串完全匹配的内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
#找到所有a标签的链接,放到一个列表里面
t_list=bs.find_all("a")
print(t_list)
[<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="...">更多产品</a>]
正则表达式搜索:使用search()方法来匹配内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
import re
t_list=bs.find_all(re.compile("a")) #包含a的所有内容
print(t_list)
[<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/5eN1bjq8AAUVYm2zgY3K/r/ww/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道</title>
</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"/>, <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="...">更多产品</a>]
方法:传入一个函数(方法),根据函数的要求来搜索(了解)
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
def name_is_exists(tag):
return tag.has_attr("name") #需要有name的标签的
t_list=bs.find_all(name_is_exists)
print(t_list)
[<meta content="always" name="referrer"/>, <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="...">更多产品</a>]
打印列表的方式
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
def name_is_exists(tag):
return tag.has_attr("name")
t_list=bs.find_all(name_is_exists)
#print(t_list)
for item in t_list:
print(item)
<meta content="always" name="referrer"/>
<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="...">更多产品</a>
(2)kwargs 参数
我想找到id="head"的内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
t_list=bs.find_all(id="head")
for item in t_list:
print(item)
<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="...">更多产品</a>
</div>
</div>
</div>
我想找到含有class类的内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
t_list=bs.find_all(class_=True)
for item in t_list:
print(item)
<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="...">更多产品</a>
</div>
</div>
<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="...">更多产品</a>
我想找到含有href="http://news.baidu.com"的内容
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
t_list=bs.find_all(href="http://news.baidu.com")
for item in t_list:
print(item)
<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
(3)text参数(文本参数)
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
#文档的搜索
t_list=bs.find_all(text="hao123")
for item in t_list:
print(item)
hao123
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.find_all(text=["hao123","地图","贴吧"])
for item in t_list:
print(item)
hao123
地图
贴吧
应用正则表达式来查找包含特定文本的内容(标签里的字符串)
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
import re
#应用正则表达式来查找包含特定文本的内容(标签里的字符串)
t_list=bs.find_all(text=re.compile("\d")) #\d表示数字
for item in t_list:
print(item)
hao123
限制查找个数
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.find_all("a",limit=3)
for item in t_list:
print(item)
<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>
css选择器
通过标签来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select('title') #通过标签来查找
for item in t_list:
print(item)
<title>百度一下,你就知道</title>
通过类名来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select(".mnav") #通过标签来查找
for item in t_list:
print(item)
<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>
通过id来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select("#u1") #通过id来查找
for item in t_list:
print(item)
<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="...">更多产品</a>
</div>
通过属性来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select("a[class='bri']") #通过属性来查找
for item in t_list:
print(item)
<a class="bri" href=" //www.baidu.com/more/" name="tj_briicon" style="...">更多产品</a>
通过子标签来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select("head>title") #通过子标签来查找
for item in t_list:
print(item)
<title>百度一下,你就知道</title>
通过兄弟标签来查找
from bs4 import BeautifulSoup
file=open("./baidu.html","rb") #以二进制方式打开文档
html=file.read().decode("utf-8") #读取一个文档做为一个对象
bs=BeautifulSoup(html,"html.parser") #解析文档,用html的解析器
t_list=bs.select(".mnav ~ .bri") #通过兄弟标签来查找
print(t_list[0].get_text())
更多产品
更多推荐
所有评论(0)