一.使用流程
解析流程:
1.pip install bs4
2.导包:from bs4 import BeautifulSoup
3.实例化一个BeautifulSoup对象(将页面源码数据加载到该对象中)
(1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml')
(2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')
4.调用BeautifulSoup对象中的相关属性和方法进行标签的定位
二.基本语法
基础巩固:
(1)根据标签名查找
- soup.a 只能找到第一个符合要求的标签
(2)获取属性
- soup.a.attrs 获取a所有的属性和属性值,返回一个字典
- soup.a.attrs['href'] 获取href属性
- soup.a['href'] 也可简写为这种形式
(3)获取内容
- soup.a.string 获取a标签的直系文本
- soup.a.text 这是属性,获取a子类的所有文本
- soup.a.get_text() 这是方法,获取a标签子类的所有文本
【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find:找到第一个符合要求的标签
- soup.find('a') 找到第一个符合要求的
- soup.find('a', title="xxx") 具有title=a属性的
- soup.find('a', alt="xxx")
- soup.find('a', class_="xxx")
- soup.find('a', id="xxx")
(5)find_all:找到所有符合要求的标签
- soup.find_all('a')
- soup.find_all(['a','b']) 找到所有的a和b标签
- soup.find_all('a', limit=2) 限制前两个
(6)根据选择器选择指定的内容
select:soup.select('#feng')
- 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
- 层级选择器:
div .dudu #lala .meme .xixi 下面好多级
div > p > a > .lala 只能是下面一级
select就是css选择器
【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
三.重点语法find和find_all
1. name参数的四种过滤器
soup=Beautifulsoup('page','lxml')
-
- 不带过滤器: print(soup.find_all()) #没有过滤,查找所有标签
- 字符串过滤器: print (soup.find_all()) #字符串过滤器,即标签名
- 列表: print(soup.find_(['a','b'])) #找到所有的a标签和b标签,任一即可
- 正则: print(soup.find_all(re.complie('^b'))) #找到所有b开头的标签
- 方法: def has_class_but_no_id(tag):
-
- return tag.has_attr('class') and not tag.has_attr('id')
- print(soup.find_all(has_class_but_no_id))
`
四.爬取小说
import requests
from bs4 import BeautifulSoup
'''
解析流程:
1.pip install bs4
2.导包:from bs4 import BeautifulSoup
3.实例化一个BeautifulSoup对象(将页面源码数据加载到该对象中)
4.调用BeautifulSoup对象中的相关属性和方法进行标签的定位
'''
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
}
url='http://www.shicimingju.com/book/sanguoyanyi.html'
page_text=requests.get(url=url,headers=headers).text
bs4=BeautifulSoup(page_text,'lxml')
#返回一个li列表
li_list=bs4.select('.book-mulu>ul>li')
f=open('./bs-三国','w',encoding='utf-8')
for li in li_list:
detail_url='http://www.shicimingju.com'+li.a['href']
detail_page_text=requests.get(detail_url).text
bs=BeautifulSoup(detail_page_text)
title=bs.select('.www-main-container>h1')[0].text #select返回的是列表
content=bs.find('div',class_='chapter_content').text
f.write(title+'
'+content)
print(title+':下载成功')