requests库
requests是一个基于HTTP协议来使用网络的第三库
安装
pip install requests
主要方法
方法 | 说明 |
---|---|
requsts.get() |
获取网页,对应HTTP中的GET方法 |
requsts.post() |
向网页提交信息,对应HTTP中的POST方法 |
get()
参数 | 类型 | 作用 |
---|---|---|
params |
字典 | url为基准的url地址,不包含查询参数;该方法会自动对params字典编码,然后和url拼接 |
url |
字符串 | requests 发起请求的地址 |
headers |
字典 | 请求头,发送请求的过程中请求的附加内容携带着一些必要的参数 |
cookies |
字典 | 携带登录状态 |
proxies |
字典 | 用来设置代理 ip 服务器 |
timeout |
整型 | 用于设定超时时间, 单位为秒 |
基本使用方法
resp = requests.get(url="http://www.baidu.com")
post()
参数 | 类型 | 作用 |
---|---|---|
data |
字典 | 作为向服务器提供或提交资源时提交,主要用于 post 请求 |
json |
字典 | json格式的数据, json合适在相关的html |
注意:
data
和params
的区别是: data提交的数据并不放在url链接里, 而是放在url链接对应位置的地方作为数据来存储
基本使用
url = "https://fanyi.baidu.com/sug"
data = {
"kw": "key word",
}
headers = {
'User-Agent': "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 96.0.4664 .93 Safari / 537.36",
}
resp = requests.post(url=url, data=data, headers=headers)
response属性
属性 | 说明 |
---|---|
resp.status_code |
http请求的返回状态,若为200则表示请求成功。 |
resp.raise_for_status() |
该语句在方法内部判断resp.status_code 是否等于200,如果不等于,则抛出异常 |
resp.text |
http响应内容的字符串形式,即返回的页面内容 |
resp.encoding |
从http header 中猜测的相应内容编码方式 |
resp.apparent_encoding |
从内容中分析出的响应内容编码方式(备选编码方式) |
resp.content |
http响应内容的二进制形式 |
resp.json() |
得到对应的 json 格式的数据,类似于字典 |
response.cookies |
查看Cookies |
基本使用
# 设置返回编码类型
response.encoding='utf8'
# 解决中文乱码
response.content.decode('utf-8')
Beautiful Soup
安装
pip install bs4
pip install lxml
导库
from bs4 import BeautifulSoup
使用
获取html文本
# 使用requests库获取html文本
resp = requests.get(url="http://www.baidu.com")
resp.encoding='utf-8'
html_text = resp.text
解析器
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, 'html.parser') |
python内置的标准库,执行速度适中 | Python3.2.2之前的版本容错能力差 |
lxml HTML解析器 | BeautifulSoup(markup, 'lxml') |
速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 | BeautifulSoup(markup 'xml') |
速度快,唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, 'html5lib') |
最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢,不依赖外部拓展 |
使用
from bs4 import BeautifulSoup
# BeautifulSoup()接受两个参数,一个是html字符串源码,第二个是要使用的解析器
soup = BeautifulSoup('<p>Hello world</p>', 'lxml')
# 格式化输出html文本
print(soup.prettify())
详细使用,参考链接
节点选择器
通过特定标签提取对于标签内容
html标签匹配
html文本内容:
<class 'bs4.BeautifulSoup'>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>BeautifulSoup学习</title>
</head>
<body>
<div id="song list">
<h2 class="title">Title</h2>
<p class="introduction">
p标签
</p>
<ul class="list-group" id="list">
<li data-view="2">li</li>
<li data-view="7">
<a href="/a1" singer="singer1">链接1</a>
</li>
<li class="active" data-view="4">
<a href="/a2" singer="singer2">链接2</a>
</li>
<li data-view="6"><a href="/a3" singer="singer3">链接3</a></li>
<li data-view="5"><a href="/a4" singer="singer4">链接4</a></li>
<li data-view="5">
<a href="/a5" singer="singer5">链接5</a>
</li>
</ul>
</div>
</body>
</html>
演示
#初始化html
sp = BeautifulSoup(html, 'lxml')
# 通过html标签匹配
print(type(sp.title)) # <class 'bs4.element.Tag'>
print(sp.title) # <title>BeautifulSoup学习</title>
print(type(sp.h2)) # <class 'bs4.element.Tag'>
print(sp.h2) # <h2 class="title">Title</h2>
根据html标签进行匹配,返回的是Tag
类型,它有如下属性:
- name: 返回节点的名字。
- string:获取节点内容,但仅限于节点里面没有其他节点的时候,返回类型
NavigableString
,可通过str()
函数转为字符串。 - attrs: 获取节点属性,字典形式返回。
演示
#初始化html
sp = BeautifulSoup(html, 'lxml')
# 通过html标签匹配
print("节点html:", sp.h2) # 节点html: <h2 class="title">Title</h2>
print("节点名字:", sp.h2.name) # 节点名字: h2
print("节点内容:", sp.h2.string) # 节点内容: Title
print("节点属性:", sp.h2.attrs) # 节点属性: {'class': ['title']}
注意1:但这种方法只能提取符合条件的第一个标签
#初始化html sp = BeautifulSoup(html, 'lxml') sp.prettify() # 通过html标签匹配 print(sp.a) # <a href="/a1" singer="singer1">链接1</a> # 只返回了第一个
注意2:对于嵌套标签,获取不到string属性
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 print("节点div的html: ", sp.div) print(type(sp.div)) print("string获取内容:", sp.div.string) # 节点div的html: <div id="song list">...</div> # <class 'bs4.element.Tag'> # string获取内容: None
关联匹配
当符合条件的节点不止一个时,用节点选择的方法只能返回第一个匹配的值,这时候我们可以用一些关联选择的方法来进行更多的匹配
-
匹配兄弟节点
next_sibling
: 获取节点的下一个兄弟节点next_siblings
: 获取节点后面的兄弟节点,返回生成器类型previous_sibling
: 获取节点的上一个兄弟节点previous_siblings
: 获取节点前面的兄弟节点,返回生成器类型
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 print("获取第一个li节点:", sp.li) # 获取第一个li节点: <li data-view="2">li</li> print(type(sp.li.next_sibling)) # <class 'bs4.element.NavigableString'> print("获取第一个li节点的下一个兄弟节点:", sp.li.next_sibling) # 获取第一个li节点的下一个兄弟节点: print(type(sp.li.next_siblings)) # <class 'generator'> # 返回一个生成器,可进行遍历 for i in sp.li.next_siblings: print(i)
-
匹配子节点或子孙节点
contents
或者children
: 获取直接子节点,centents返回列表,children返回生成器类型
descendants
: 获取所有子孙节点,返回生成器类型获取所有子节点
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 for i in enumerate(sp.ul.contents): print(i)
获取所有子孙节点
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 print(type(sp.ul.descendants)) for i in enumerate(sp.ul.descendants): print(i)
-
父节点和祖先节点
获取父节点
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 print(type(sp.ul.parent)) # <class 'bs4.element.Tag'> print(sp.ul.parent.name) # div
获取祖先节点
#初始化html sp = BeautifulSoup(html, 'lxml') # 通过html标签匹配 print(type(sp.ul.parents)) # <class 'generator'> for i in sp.ul.parents: print(i.name) # div # class # body # html # [document]
方法选择器
find_all()
:查找所有满足条件的值,用法如下
find_all(name, attrs, recursive, text, **kargs) # 返回列表
name
: 根据节点名称来选择,传入形式name=valueattrs
: 根据属性来选择,attrs值为字典形式recursive
: 限定直接子节点text
: 根据文本来选择,传入形式是字符串,可以是正则表达式。
根据name匹配
#初始化html
sp = BeautifulSoup(html, 'lxml')
# 通过html标签匹配
a = sp.find_all(name='a') # 提取a节点信息
根据属性attrs选择
#初始化html
sp = BeautifulSoup(html, 'lxml')
# 通过html标签匹配
title = sp.find_all(attrs={'class': 'title'})
print(title) # [<h2 class="title">Title</h2>]
根据文本text选择
#初始化html
sp = BeautifulSoup(html, 'lxml')
# 通过html标签匹配
a = sp.find_all(text=r'链接1')
print(a) # ['链接1']
标签:lxml,sp,BeautifulSoup,html,print,requests,节点
From: https://www.cnblogs.com/LuckyZhq/p/17082208.html