爬虫-bs4
一、作用
- bs4就是通过HTML标 签和属性去定位⻚⾯上的内容的
- bs4模块安装
ip install bs4
ip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs
二、使用
准备一个HTML文件
<html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> <div class="url"> <ul> <li><a href="http://www.baidu.com">百度</a></li> <li><a href="http://www.google.com">谷歌</a></li> <li><a href="http://www.sogou.com">搜狗</a></li> </ul> <ol> <li><a href="feiji">飞机</a></li> <li><a href="dapao">大炮</a></li> <li><a href="huoche">火车</a></li> </ol> </div> <div class="job">李嘉诚</div> <div class="common">胡辣汤</div> </body> </html>
from bs4 import BeautifulSoup # 使用前先导入
file = open('b.html', encoding='utf-8') soup = BeautifulSoup(file,'lxml') # 将本地的html文档中的数据加载到该对象中 print(soup) # 返回全部内容
- 获取标签信息
print(soup.ul) #返回ul内容 print(soup.div) #等同于 print(soup.find('div')) #具体定位到某一个div,可根据属性定位 print(soup.find('div',class_='common')) #<div class="common">胡辣汤</div> # 属性定位 soup.findAll('tagName') #返回soup中符合要求的所有标签 a_list = soup.findAll('a') #返回的是一个列表 for a in a_list: print(a) print(soup.findAll('a')[1]) #定位第2个a标签的内容 # <a href="http://www.google.com">谷歌</a>
- 选择器select
# -select('某种选择器(id,class ,标签。。。选择器)’) print(soup.select('.common')) #返回login下的所有标签 :[<div class="common">胡辣汤</div>] print(soup.select('div')[1]) #返回一个列表 :<div class="job">李嘉诚</div>
- 层级选择器
#一个 > 表示一个层级 :获取a标签下的第一个href print(soup.select('.url > ul > li > a')[0]['href']) # http://www.baidu.com
#一个 > 表示一个层级 :获取所有a标签
print(soup.select('.url > ol > li > a ')) #[<a href="feiji">飞机</a>, <a href="dapao">大炮</a>, <a href="huoche">火车</a>]
另外层级之间除了用>来表示上下层关系,还可以用空格表示多个层级;
# soup.select('.tag > ul a') #空格表示多个层级 ,注意别忘了前面的. print(soup.select('.url ul a')) #[<a href="http://www.baidu.com">百度</a>, <a #href="http://www.google.com">谷歌</a>, <a #href="http://www.sogou.com">搜狗</a>] print(soup.select('.url ol li a')) #[<a href="feiji">飞机</a>, <a href="dapao">大炮</a>, <a href="huoche">火车</a>]
- 获取标签之间的文本, 方法有:
- soup.a.text
- string
- get_text()
print(soup.find('div',class_= 'url').text) #可以获取某一个标签中所有内容 返回的是一个str """ 百度 谷歌 搜狗 飞机 大炮 火车 """
print(soup.find('div',class_= 'job').string) #李嘉诚
如果想要获取ul > li > a中的某一个值
# 获取标签中属性值 # soup.a['href'] #测试下只返回第一个值, # print(soup.a['href']) #http://www.baidu.com
print(soup.select('.url > ul > li > a')[1]['href']) #可以通过【】变量来获取不同链接 #http://www.google.com
print(soup.select('.url > ul > li > a')[2].text) #获取中间的值
# 搜狗
三、