Python接口测试学习笔记(七)

本文学习笔记整理自【Python开发】接口测试教程

一. html解析

1. bs4介绍及安装

a. 官方介绍:

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

b. 安装:

pip install beautifulsoup4

2. bs4对象的种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment:

Tag: Tag对象与XML或HTML原生文档中的tag相同, 如: <h1 class="listtitle">导航</h1>, 这就是一个标签

NavigableString: 字符串常被包含在tag内.Beautiful Soup用 NavigableString类来包装tag中的字符串, 如: 导航

BeautifulSoup: 就是整个html对象

Comment: 注释对象, 如: <!DOCTYPE html>, 它其实就是一个特殊NavigableString

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.cnblogs.com/fayez/")

# html解析是多种解析方式之一, 其他还有lxml 和 html5lib, 详情请查看官网
soup = BeautifulSoup(r.content, "html.parser")

# Tag 对象(找到第一个符合的tag)
print(soup.h1)
print(type(soup.h1))
# soup.find_all("h1")找到所有的"h1"tag
print(soup.find_all("h1"))

# NavigableString对象
print(soup.h1.string)
print(type(soup.h1.string))
# BeautifulSoup对象
print(type(soup))

3. 获取内容的方法等:

1. tag属性:

1. tag.attrs可以返回所有的属性, 返回内容为字典格式

2. 获取其中的某个一属性, 跟操作字典一样, 如: tag["href"]

3. 由于class属性一般可以为多个,中间空格隔开, 所有class属性获取的是一个list类型:[u'classes']

import requests
from bs4 import BeautifulSoup

r = requests.get("https://cn.bing.com/")

soup = BeautifulSoup(r.content, "html.parser")
# 获取所有属性
print(soup.input.attrs)
# 获取对应属性的值
print(soup.input["title"])
# class属性返回list
print(soup.input["class"])
# 获取class属性的每个内容
print(soup.input["class"][0])

2. get_text()

1. find_all查找的是一个list对象

2. get_text()获取tag标签下所有的文本

3. replace替换字符串里面的特殊字符

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.cnblogs.com/fayez/")

soup = BeautifulSoup(r.content, "html.parser")
# 查找所有类名为"posttitle"的标签
articles = soup.find_all(class_="posttitle")
for i in articles:
    print(i.get_text().replace("
", ""))

3. contents

1. find只查找一个(返回第一个)

2. Contents返回所有的子Tag(list)

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.cnblogs.com/fayez/")

soup = BeautifulSoup(r.content, "html.parser")
articles = soup.find(id="rightcontent")
print(articles.contents)

二. 爬取图片到本地(可下漫画~)

# coding:utf-8
import requests
from bs4 import BeautifulSoup
import os

r = requests.get("http://699pic.com/sousuo-218808-13-1.html")
soup = BeautifulSoup(r.content,"html.parser")
# 查找所有 class="lazy" 的元素
images = soup.find_all(class_="lazy")
curPath = os.path.dirname(os.path.realpath(__file__))
for i in images:
    try:
        # 获取元素中对应属性的值
        jpg_url = i["data-original"]
        title = i["title"]
        # 请求各图片地址(比视频中多了个 “http:”)
        im = requests.get("http:"+jpg_url)
        # 写入图片
        with open(title+".jpg","wb") as f:
            f.write(im.content)
    except Exception as msg:
        print("msg")

三. 概念 & 方法 & 参数

0. 更具体请查看 bs4 中文官网

1. 父子节点:如果无法一次性找到一个 Tag, 那就先找他父节点,父节点找不到就找爷爷节点。

# coding:utf-8
import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.cnblogs.com/fayez/p")
soup = BeautifulSoup(r.content,"html.parser")
titles = soup.find_all(class_="postTitl2")
for i in titles:
    # i 是父亲节点,a 是期望获取的节点
    print(i.a.string)

2. find_all: find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

3. limit 参数:limit 参数限制返回结果的数量

soup.find_all("a", limit=2)
原文地址:https://www.cnblogs.com/fayez/p/12456738.html