1. BeautifulSoup介绍
HTML或XML的解析库。支持的解析器有:
2. 初始化解析
2.1 解析HTML文本:
from bs4 import BeautifulSoup
soup = BeautifulSoup(res.text,'lxml')
print(soup.prettify()) #prettify()方法将要解析的字符串以标准的缩进格式输出
2.2 解析本地文件:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('./test.html',encoding='utf-8','lxml')
print(soup.prettify()) #prettify()方法将要解析的字符串以标准的缩进格式输出
3.节点选择器
本地Html文件:
<head>
<meta charset="UTF-8">
<title>The Dormouse's story</title>
</head>
<body>
<p class="title" name="dormouse"><b>The Dormouse's story</b></p>
<p class="story">there name were
<a href="http://elsie" class="sister" id="link1"><span>Elsie</span></a>,
<a href="http://lacie" class="sister" id="link2">Lacie</a>and
<a href="http://tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
</body>
from bs4 import BeautifulSoup
import lxml
soup = BeautifulSoup(open('./test.html',encoding='utf-8'),'lxml')
3.1 选择元素
print(soup.title) #title标签加文字内容
print(type(soup.title)) #<class 'bs4.element.Tag'>
print(soup.title.string) #利用Tag对象的string属性获取文本内容
print(soup.p) #当有多个节点时值匹配到第一个
3.2 提取信息 3.2.1 获取节点名称
print(soup.title.name)
3.2.2 获取属性
print(soup.p.attrs) #获取p节点的所有属性和值,结果字典形式
print(soup.p.attrs['name']) #获取p节点name属性的值
更简洁的方式
print(soup.p['class']) #一个节点元素可能有多个class,所以返回列表
print(soup.p['name'])
3.3获取内容
print(soup.p.string)
3.1 嵌套使用
print(soup.head.title.string) #如果返回的为Tag对象可以继续调用节点进行选择
3.2.1 关联选择,子节点和子孙节点
print(soup.p.contents) #返回直接子节点的列表
print(soup.p.children) #返回直接子节点的生成器,需迭代输出
for child in enumerate(soup.p.children):
print(child)
print(soup.p.descendants) #返回所有子孙节点的生成器,需迭代输出
for child in enumerate(soup.p.descendants):
print(child)
3.2.2 关联选择,父节点和子孙节点
print(soup.a.parent) #直接父节点
print(list(enumerate(soup.a.parents))) #所有祖先节点,返回生成器
3.2.3 关联选择,兄弟节点
print(soup.a.next_sibling) #下一个节点元素
print(soup.a.previous_sibling) #上一个节点元素
print(list(enumerate(soup.a.next_siblings) )) #后面所有节点元素的生成器
print(soup.a.previous_siblings) #前面所有节点元素的生成器
3.2.4 关联选择,提取信息
print(list(soup.a.parents)[0]) #用列表索引或信息提取方法来提取
4.方法选择器
本地HTML代码:
<body>
<ul class="list">
<li class="first" name="dennisz" id="one">桃花影落飞神剑</li>
<li class="hehe">我心已向大海</li>
<li title="third line">碧海潮生按玉箫</li>
<li>笑书神侠倚碧鸳</li>
<a href="http://www.baidu.com">金庸</a>
</ul>
<div class="xixi">
<ul>
<!-- 这是一个注释 -->
<li class="second" id="two">谁管世间满风浪</li>
<li class="haha">仗剑匹马走天涯</li>
<li id="yoyoyo">笑傲江湖成绝响</li>
<li class="ok" id="no">人间再无侠客行</li>
<div>
<li>令狐</li>
<li>任我行</li>
<li>盈盈</li>
<li>东方不败</li>
<li>左冷禅</li>
<li>岳不群</li>
</div>
</ul>
<d>
<a href="http://www.taobao.com">绝世秘籍</a>
</d>
</div>
</body>
4.1 通过节点名称查询
print(soup.find_all('li')) #返回所有li标签,结果以列表形式
print(soup.find_all('li',limit=3)) #限制条数
print(soup.find_all(['li','a'])) #返回所有的li或a标签
4.2通过属性查询
print(soup.find_all('li',class_='second')) #返回class='second'的li标签
print(soup.find_all('li',class_='second')[0].string)
4.3 其他方法
5.CSS选择器
本地html代码:
<body>
<ul class="list1">
<li class="first" name="dennisz" id="one">桃花影落飞神剑</li>
<li class="hehe">我心已向大海</li>
<li title="third line">碧海潮生按玉箫</li>
<li>笑书神侠倚碧鸳</li>
<a href="http://www.baidu.com">金庸</a>
</ul>
<div class="xixi">
<ul class="list2">
<!-- 这是一个注释 -->
<li class="second" id="two">谁管世间满风浪</li>
<li class="haha">仗剑匹马走天涯</li>
<li id="yoyoyo">笑傲江湖成绝响</li>
<li class="ok" id="no">人间再无侠客行</li>
<div>
<li>令狐</li>
<li>任我行</li>
<li>盈盈</li>
<li>东方不败</li>
<li>左冷禅</li>
<li>岳不群</li>
</div>
</ul>
<d>
<a href="http://www.taobao.com">绝世秘籍</a>
</d>
</div>
</body>
5.1 根据标签查找
print(soup.select('li')) #所有li标签
根据class属性查找
print(soup.select('.list'))
print(soup.select('li[class="hehe"]'))
根据id查找
print(soup.select('#two'))
print(soup.select('li[id="no"]'))
5.2 嵌套查找
for ul in soup.select('ul'):
print(ul.select('li'))
5.3 获取属性
for ul in soup.select('ul'):
print(ul['class']) #两种方法都可以
print(ul.attrs['class'])
5.4获取文本
for li in soup.select('li'):
print(li.text) #三种方法都可以
print(li.string)
print(li.get_text())