Python BeautifulSoup精准获取指定class样式的div元素

白榆
白榆
发布时间:2026-10-14| 5人浏览过
原创

本文详解在Python爬虫中获取指定class样式的div标签的三种方法。对比字符串查找与正则表达式的局限性,重点介绍BeautifulSoup库的使用技巧。通过字典形式赋值attrs参数解决官方文档示例无效的问题,并提供完整代码示例及图片下载实战,帮助开发者高效准确提取网页数据。

获取指定class样式div的三种常见方法

在网页解析与数据爬取过程中,精准获取特定标签内容是一项基础且关键的操作。例如,当需要提取包含特定class属性的div标签(如<div class='xxx'>...</div>)时,通常有三种主流实现路径。

第一种方法是利用字符串查找函数进行切片处理,例如使用str.index(patternStr)或str.find(patternStr)。该方式执行速度较快,但操作步骤繁琐,需要手动去除首尾多余的字符。

第二种方法是借助正则表达式,例如使用模式'<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。

假设存在如下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的</div>误判为结束标记。

BeautifulSoup精准提取技巧与代码示例

第三种方法是使用第三方库,如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')

经过测试,上述两种写法均无法返回匹配结果。经验证,必须采用字典形式为attrs参数赋值,即使用soup.find_all(name='div',attrs={"class":"footer"})才能正确获取目标元素。

另一个实用案例是获取指定class样式的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://www.jb51.net/article/184386.htm

至此,关于使用BeautifulSoup获取指定class样式div的实现方法已介绍完毕。如需获取更多相关技巧,建议搜索本站历史文章或继续浏览后续内容,感谢支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。