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 tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
使用Python构造hive insert语句说明
Jun 06 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python安装并操作redis实现流程详解
Oct 13 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
python实现图片批量压缩
Apr 24 Python
Python中的变量与常量
Nov 11 Python
python周期任务调度工具Schedule使用详解
Nov 23 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
PHP5函数小全(分享)
2013/06/06 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
document.all还是document.getElementsByName?
2006/07/21 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
在Python中使用Mako模版库的简单教程
2015/04/08 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
pandas 选择某几列的方法
2018/07/03 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
华三通信H3C面试题
2015/05/15 面试题
几道Web/Ajax的面试题
2016/11/05 面试题
大学生冰淇淋店商业计划书
2014/01/14 职场文书
运动会广播稿150字
2014/02/19 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
spring boot实现文件上传
2022/08/14 Java/Android