BeautifulSoup获取指定class样式的div的实现


Posted in Python onDecember 07, 2020

如何获取指定的标签的内容是解析网页爬取数据的必要手段,比如想获取<div class='xxx'> ...<div>这样的div标签,通常有三种办法,

1)用字符串查找方法,然后切分字符串(或切片操作),如str.index(patternStr)或str.find(patternStr),这种方法快,但步骤多,因为要去头去尾。

2)用正则表达式,比如'<div class="result_info">([\s\S]+?)</div>',通过正则表达式的括号,可以获取匹配的内容,即<div ..></div>之间的内容:

import re

def getTags(html):
 reg = r'<div class="result_info">([\s\S]+?)</div>'
 pattern= re.compile(reg)
 tags= re.findall(pattern, html)
 return tags

不过正则表达式仍有缺点,例如'<div class="result_info">([\s\S]+?)</div>'括号中的问号表示非贪婪匹配,正常情况下可以匹配到所需要的内容,但如果class="result_info"的div中还嵌套了子的div,那么正则表达式的后半部分"</div>"将会匹配子div的结尾部分</div>,而不是希望的父div.

假如有这样一个html:

<div class="result_info">
  <p>some paragraph test 1
  </p>
  <p>some paragraph test 2
  </p>
  <div id="div_sub" class="sub_div_style">
  some contents in sub div
  </div>
  backend content here
 </div>

那么backend contents here这段内容将会匹配不到,正则表达式将会将id为div_sub的</div>作为结尾。

3)使用第三方库,比如BeautifulSoup,优点是准确,缺点是速度会比字符串切分、正则表达式慢,下面说说BeautifulSoup的用法。

按照BeautifulSoup官方文档的说明怎么都不能成功,后来在百度知道(http://zhidao.baidu.com/question/433247968620775644.html)找到答案,真是扯淡,附上有效代码:

soup=BeautifulSoup(html)
print soup.find_all(name='div',attrs={"class":"footer"})#按照字典的形式给attrs参数赋值

完整的:

from bs4 import BeautifulSoup
import urllib2

def getTargetDiv(url,myAttrs):
 html=urllib2.urlopen(url).read()
 soup=BeautifulSoup(html)
 return soup.find_all(name='div',attrs=myAttrs)

if __name__=="__main__":
 url=r'http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/'
 myAttrs={'class':'footer'}
 print getTargetDiv(url, myAttrs)

按照官方文档(http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/)的做法:

#1.soup.find_all("a", class_="sister")
#2.css_soup.find_all("p", class_="body")
#3.soup.find_all(href=re.compile("elsie"))

改成

soup.find_all(name='div',class_=re.compile('info_item'))

或者

soup.find_all('div',class_='info_item')

都没有匹配结果,经测试需要soup.find_all(name='div',attrs={"class":"footer"})这样以字典的形式给attrs参数赋值才可以。

另一个例子,获取指定样式的div内的所有图片url,并下载保存:

urls=[]
for img in soup.find('div',attrs={'class':'wrap'}).find_all('img'):#找到class="wrap"的div里面的所有<img>标签
 urls.append(img.attrs['src'])#获取img标签的src属性,即图片网址

i=0
savedir=r'C:\Users\hp\Desktop\Images'#路径中不能包含中文
for url in urls:
 urllib.urlretrieve(url, '%s\%s.jpg'%(savedir,i))
 i+=1
print 'Done'

更多用法,可参考:https://3water.com/article/184386.htm

到此这篇关于BeautifulSoup获取指定class样式的div的实现的文章就介绍到这了,更多相关BeautifulSoup获取class样式的div内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python压缩和解压缩zip文件的教程
May 06 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
python直接获取API传递回来的参数方法
Dec 17 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 23 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
Python文件夹批处理操作代码实例
Jul 21 Python
Python list和str互转的实现示例
Nov 16 Python
Python绘制分类图的方法
Apr 20 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 #Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 #Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 #Python
用python对excel查重
Dec 07 #Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 #Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 #Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 #Python
You might like
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
从vue源码看props的用法
2019/01/09 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
Django学习之文件上传与下载
2019/10/06 Python
python next()和iter()函数原理解析
2020/02/07 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
应届生人事助理求职信
2013/11/09 职场文书
供用电专业求职信
2014/07/07 职场文书
煤矿安全协议书
2014/08/20 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
《假如》教学反思
2016/02/17 职场文书
python高温预警数据获取实例
2022/07/23 Python