使⽤python库解析dom树
使⽤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的可以查看,楼主的项⽬建的很简单index.py和⼀个html⽂件夹,⾥⾯放有⼀些.html静态⽂件
index.py⽂件
# coding=utf-8
import os
from bs4 import BeautifulSoup
import 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)
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,)来查,也
#也可以通过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:
python解释器下载
#关闭⽂件
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来做⼀个简单的爬⾍,爬取线上指定数据并保存在本地。好了今天就到这。
谢谢⼤家,⼩弟才开始写博客有错误的地⽅希望多多指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。