使用Beautiful Soup解析dom

来源:互联网 发布:如何查看淘宝卖家信息 编辑:程序博客网 时间:2024/06/02 04:45

使用Beautiful Soup解析dom

本文主要介绍如何使用Beautiful Soup解析dom。

Beautiful Soup的简介

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

Beautiful Soup 安装

博主使用的是mac,这里面就只介绍在mac下Beautiful Soup的安装方法。python 第三方库安装都很简单,楼主一直都使用pip来安装。

安装pip

easy_install pip

安装Beautiful Soup

pip install beautifulsoup4

有时候我们使用pip install beautifulsoup4 命令来安装会报错,这时候我们需要在命令前加上sudo来获得权限。

sudo pip install beautifulsoup4

到目前为止我们的准备工作就做好了,现在我们可以开始使用Beautiful Soup。本文只使用到了bs4(备注:文章中bs4=beautifulsoup4)部分方法,想要进一步了解bs4的可以查看bs4官方文档,楼主的项目建的很简单index.py和一个html文件夹,里面放有一些.html静态文件

index.py文件

# coding=utf-8import osfrom bs4 import BeautifulSoupimport sys #定义一个list来存放文件路径paths=[]#获取所有的文件路径def get_paths():    for fpathe,dirs,fs in os.walk('html'):        for f in fs:            #print os.path.join(fpathe,f)            #将拼接好的path存放到list中            filepath=os.path.join(fpathe,f)            #只放入.html后缀文件路径            if(os.path.splitext(f)[1]==".html"):                paths.append(filepath)#读取html文件修改后并写入相应的文件中去def reset_file(path):    #判断文件是否存在    if not os.path.isfile(path):        raise TypeError(path + " does not exist")    #读取文件,bs4自动将输入文档转换为Unicode编码,    #输出文档转换为utf-8编码,bs4也可以直接读取html    #字符串,例如BeautifulSoup('<div>content</div>')    soup=BeautifulSoup(open(path))    #select是bs4提供的方法,和jquery的$选择器一样    #方便。可以标签(eg:div,title,p...)来查找,也    #也可以通过css的 class .和id #来查找,基本上和我们    #使用$一样。    #选取id="nav"节点下的所有li元素里面的a标签,返回值是一个list集合    nav_a=soup.select("#nav li a")    #修改a的href属性    if(len(nav_a)>1):        nav_a[0]["href"]="/m/"        nav_a[1]["href"]="/m/about_mobile/m_about.html"    #选取class="footer"里的所有a标签    footer_a=soup.select(".footer a")    if(len(footer_a)>0):        footer_a[1]["href"]="/m/about_mobile/m_sjdt.html"    content_p=soup.select(".content p")    #修改<p>我是string</p>里面的文本内容    if(len(content_p)>0):        content_p[0].string="修改p标签里面的测试内容"    #修改系统的默认编码    reload(sys)                        sys.setdefaultencoding('utf-8')     #打开相应的文件写入模式,打开文件不要放入try里面,否则会    #出现异常    f=open(path,"w")    try:        #写入文件        f.write(soup.prettify())    finally:        #关闭文件        file.close()#定义main函数程序的入口    if __name__=="__main__":    get_paths()    #遍历所有文件路径    for p in paths:        reset_file(p)

感想

用了一个很大的标题来突出感想,因为我觉得感想很重要需要着重突出。写这篇文章的本意不是和大家介绍bs4的使用,主要是想让我们学会制造工具去解决重复的工作。楼主写这个轮子的原因是因为朋友(坑货)让我帮忙从网络上扒一个动态的网站的所有的静态资源,楼主使用了teleport ultra(具体是啥,大家可以百度楼主经常用特别好使)将一个网站完整的静态资源下载了下来。发现有好几千个静态页面的上的部分跳转地址有问题。犹豫了一下是傻傻的手动修改,还是写个轮子跑一下。最终本着自己作为一个程序员这样屌丝的身份还是说服自己写一个轮子。起初的思路是想读取文件再用正则去匹配数据,做了一会儿发现这条路行不通,和朋友沟通后推荐我使用python的第三方库来读取html文件解析dom树。楼主开始使用python自带的HTMLParser来做发现用起来特别麻烦,就在我万能的度娘上问了一下,很多童鞋都在推荐bs4。抱着学习的态度看了下发现真的是个好东西,画了2个小时写了轮子,花了几分钟把几千个文件跑了一遍文件修改就大功告成了。其实bs4大多都用在爬虫上,爬到整个页面数据后,获取指定的数据,本着好学的精神下一期我们用bs4来做一个简单的爬虫,爬取线上指定数据并保存在本地。好了今天就到这。

谢谢大家,小弟才开始写博客有错误的地方希望多多指正。