首页 > 其他分享 >requests库和BeautifulSoup库

requests库和BeautifulSoup库

时间:2023-02-01 13:24:08浏览次数:56  
标签:lxml sp BeautifulSoup html print requests 节点

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

注意dataparams 的区别是: 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

关联匹配

当符合条件的节点不止一个时,用节点选择的方法只能返回第一个匹配的值,这时候我们可以用一些关联选择的方法来进行更多的匹配

  1. 匹配兄弟节点

    • 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)
    
  2. 匹配子节点或子孙节点

    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)
    
  3. 父节点和祖先节点

    获取父节点

    #初始化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=value
  • attrs: 根据属性来选择,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

相关文章

  • requests.exceptions.ChunkedEncodingError: ("Connection broken: InvalidChunkLengt
    Traceback(mostrecentcalllast):File"D:\code_tool\spiderYesmro3\venv\lib\site-packages\urllib3\response.py",line761,in_update_chunk_lengthself.c......
  • python爬虫(三)- HTML解析之BeautifulSoup4
    BeautifulSoup可以从HTML、XML中提取数据。官网https://www.crummy.com/software/BeautifulSoup/官方中文文档https://www.crummy.com/software/BeautifulSoup/bs4/doc.......
  • 接口自动化测试|Requests库的安装与介绍
    Requests:Requests模块简介与安装Requests模块简介在python的标准库中,虽然提供了urllib,utllib2,httplib,但是做接口测试,requests使用更加方便快捷,正如官方说的,“让HTTP服务人......
  • beautifulsoup入门
    安装beautifulsouppipinstallbeautifulsoup4  简单代码示例:importrequests#导入requests包frombs4importBeautifulSoup#导入beautifulsoup包defgetit()......
  • python3 分割键值对cookies并将键和值赋值给cookiejar,传递给requests
    importtimeimportrequestsimportrequests.cookies#格式化成2016-03-2011:45:39形式print(time.strftime("%Y-%m-%d%H:%M:%S",time.localtime()))print(time.......
  • gitlab Merge Requests操作流程
    引用https://juejin.cn/post/6993548883729055780一、配置受保护的分支创建一个分支例如prd将prd分支也设置为protect分支配置保护分支二、提交者MergeRequests......
  • Python - requests 使用记录
    requests使用简单方法记录importrequestsfromfake_useragentimportUserAgentua=UserAgent()headers={'User-Agent':ua.random#伪装}#......
  • 解决 requests cookies 为空的坑
    转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/5d14f0d7.html你好,我是测试蔡坨坨。我们在做接口自动化测试的时候,一般会通过调用登录接口来获取cookies。有......
  • 4.Requests【HTTP协议】响应
    一、前言当然,有请求就有响应,浏览器在接收到服务端的响应数据后,经过处理将有用的信息展示到浏览器上。所以,接口自动化也需要对响应内容进行解析或提取有用的数据。二、学......
  • 5.Requests【接口请求】requests模拟发送get请求
    一、前言在前面的课程中我们讲了fiddler的使用,其实对应接口自动化来说,只需要知道怎么通过inspectors页签获取接口信息即可,关于fiddler的其他使用在接口测试中才会使用。......