一、bs4数据解析

python当中独有的一种解析方式

1、bs4数据解析原理:

  1. 实例化一个**BeautifulSoup**对象,并且将源码数据加载到该对象中

**

  1. 通过调用**BeautifulSoup**对象中相关的属性或者方法及进行标签定位或者数据提取


2、代码实现

**

  1. 在cmd中使用

pip install beautifulsoup4
pip install lxml 解析器

  1. 对象的实例化, 并将网页源码加载到该对象中

from bs4 import BeautifulSoup

  • 将本地的html 文档中的数据加载到该对象中

    1. from bs4 import BeautifulSoup
    2. import lxml
    3. if __name__ == '__main__':
    4. # 第一个参数是一个fp,就是open()对象返回的值 第二个参数永远为lxml
    5. fp = open("./bokeyuan.html", "r"o, encoding="utf-8")
    6. soup = BeautifulSoup(fp, "lxml")
    7. print(soup.text)
  • 将互联网上获取的页面源码加载到该对象中

    1. page_text = response.text
    2. soup = BeautifulSoup(page_text, "lxml")

    **

  1. 该对象提供的数据解析的方法和属性


类型 方法/属性 详情 示例
标签定位 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、爬取诗词名句网中的三国演义所有的标题和内容

首先使用通用爬虫先把页面爬取下来

  1. import requests
  2. from bs4 import BeautifulSoup
  3. if __name__ == '__main__':
  4. # 发送通用爬虫,先把整个页面爬取出来
  5. # 三国演义路径
  6. url = "https://www.shicimingju.com/book/sanguoyanyi.html"
  7. headers = {
  8. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
  9. }
  10. # 发送第一次请求
  11. response = requests.get(url, headers=headers)
  12. # 获取bs对象
  13. soup = BeautifulSoup(response.text, "lxml")
  14. # 获取每一章的标题,返回一个list列表
  15. title_list = soup.select(".book-mulu > ul > li a")
  16. # 通用路径
  17. new_url = "https://www.shicimingju.com"
  18. text_info = ""
  19. fp = open("./三国演义.txt", "w", encoding="utf-8")
  20. for x in title_list:
  21. print(x.string)
  22. # 查询出来的内容拼接到新的字符串里面
  23. text_info = x.string + "\n"
  24. fp.write(text_info)
  25. # 获得每个a标签里面的 href
  26. page_href = x["href"]
  27. # 拼接每一章节的url
  28. send_url = new_url + page_href
  29. # print(send_url)
  30. # 发送请求
  31. page_response = requests.get(send_url, headers=headers)
  32. page_soup = BeautifulSoup(page_response.text, "lxml")
  33. p_list = page_soup.select(".chapter_content > p")
  34. text_info = ""
  35. for x in p_list:
  36. text_info += x.text + "\n"
  37. fp.write(text_info)
  38. fp.close()
  39. print("爬取完毕")

**