一、bs4数据解析
python当中独有的一种解析方式
1、bs4数据解析原理:
- 实例化一个
**BeautifulSoup**
对象,并且将源码数据加载到该对象中
**
- 通过调用
**BeautifulSoup**
对象中相关的属性或者方法及进行标签定位或者数据提取
2、代码实现
**
- 在cmd中使用
pip install beautifulsoup4
pip install lxml
解析器
- 对象的实例化, 并将网页源码加载到该对象中
from bs4 import BeautifulSoup
将本地的html 文档中的数据加载到该对象中
from bs4 import BeautifulSoup
import lxml
if __name__ == '__main__':
# 第一个参数是一个fp,就是open()对象返回的值 第二个参数永远为lxml
fp = open("./bokeyuan.html", "r"o, encoding="utf-8")
soup = BeautifulSoup(fp, "lxml")
print(soup.text)
将互联网上获取的页面源码加载到该对象中
page_text = response.text
soup = 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 requests
from bs4 import BeautifulSoup
if __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标签里面的 href
page_href = x["href"]
# 拼接每一章节的url
send_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("爬取完毕")
**