本文学习笔记整理自【Python开发】接口测试教程
一. html解析
1. bs4介绍及安装
a. 官方介绍:
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)