一、bs4数据解析
python当中独有的一种解析方式
1、bs4数据解析原理:
- 实例化一个
**BeautifulSoup**对象,并且将源码数据加载到该对象中
**
- 通过调用
**BeautifulSoup**对象中相关的属性或者方法及进行标签定位或者数据提取
2、代码实现
**
- 在cmd中使用
pip install beautifulsoup4pip install lxml 解析器
- 对象的实例化, 并将网页源码加载到该对象中
from bs4 import BeautifulSoup
将本地的html 文档中的数据加载到该对象中
from bs4 import BeautifulSoupimport lxmlif __name__ == '__main__':# 第一个参数是一个fp,就是open()对象返回的值 第二个参数永远为lxmlfp = open("./bokeyuan.html", "r"o, encoding="utf-8")soup = BeautifulSoup(fp, "lxml")print(soup.text)
将互联网上获取的页面源码加载到该对象中
page_text = response.textsoup = BeautifulSoup(page_text, "lxml")
**
- 该对象提供的数据解析的方法和属性
| 类型 | 方法/属性 | 详情 | 示例 |
|---|---|---|---|
| 标签定位 | soup.标签名 | 返回标签名和标签里面的内容 【第一次出现的】 | soup.ul |
| soup.标签名.name | 返回标签名 | soup.ul.name | |
| soup.标签名.string | 返回标签名里面的内容 | soup.ul.string | |
| soup.find(“标签名”) | 等同于上面【返回第一次出现的】 | soup.find(“ul”) | |
| soup.find_all(“标签名”) | 返回符合要求的所有标签[以列表的方式返回] | soup.find_all(“div”) | |
| class属性定位 | soup.find(“标签名”, class_=”class名”) | 通过对应的标签名 和class找到对应的元素[第一次出现的] | soup.find(“div”, class_=”name”) |
| soup.find_all(“标签名”, class=”class名”) | 和上面一样,不同的是返回多个,以列表的形式返回 | soup.findall(“div”, class=”name”) | |
| css选择器 | soup.select(“.class名”) | 通过class名找到元素,返回列表 | soup.select(“.name”) |
| soup.select(“#id名”) | 通过id 找到元素并返回 | soup.select(“#login”) | |
| 层级关系 | soup.select(“.class名/#id名 > ul > li > a “) | 一层一层的往下找 返回找到的元素列表,最后可以通过下标来控制 【> 表示多个一个层级, 空格表示多个层级】 | print(soup.select(“#nav_left > li > a”)[0]) |
3、获取标签中之间的文本数据:
**
| 属性/方法 | 介绍 | 区别 |
|---|---|---|
| soup.a.text | 获取标签中的文本数据 | |
| soup.a.string | 获取标签中的文本数据 | 只可以获取该标签下面直系的文本内容 |
| soup.a.get_text() | 获取标签中的文本数据 | text/get_text()方法可以获得某一个标签中所有的文本内容 【即使不属于直系的都可以获取】 |
4、获取标签中的属性值
**
| 属性/方法 | 介绍 | 示例 | 注意 |
|---|---|---|---|
| soup.a[‘href’] | 获得标签对应属性的属性值 | print(soup.select(“#nav_left > li > a”)[0][“href”]) | 如果有多个a 会报错 |
5、爬取诗词名句网中的三国演义所有的标题和内容
首先使用通用爬虫先把页面爬取下来
import requestsfrom bs4 import BeautifulSoupif __name__ == '__main__':# 发送通用爬虫,先把整个页面爬取出来# 三国演义路径url = "https://www.shicimingju.com/book/sanguoyanyi.html"headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"}# 发送第一次请求response = requests.get(url, headers=headers)# 获取bs对象soup = BeautifulSoup(response.text, "lxml")# 获取每一章的标题,返回一个list列表title_list = soup.select(".book-mulu > ul > li a")# 通用路径new_url = "https://www.shicimingju.com"text_info = ""fp = open("./三国演义.txt", "w", encoding="utf-8")for x in title_list:print(x.string)# 查询出来的内容拼接到新的字符串里面text_info = x.string + "\n"fp.write(text_info)# 获得每个a标签里面的 hrefpage_href = x["href"]# 拼接每一章节的urlsend_url = new_url + page_href# print(send_url)# 发送请求page_response = requests.get(send_url, headers=headers)page_soup = BeautifulSoup(page_response.text, "lxml")p_list = page_soup.select(".chapter_content > p")text_info = ""for x in p_list:text_info += x.text + "\n"fp.write(text_info)fp.close()print("爬取完毕")
**
