Python BeautifulSoup精准获取指定class样式的div元素
本文详解在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的实现方法已介绍完毕。如需获取更多相关技巧,建议搜索本站历史文章或继续浏览后续内容,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









