使用python库解析dom树

使用Beautiful Soup解析dom

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

Beautiful Soup的简介

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

Beautiful Soup 安装

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

安装pipjquery

easy_install pip复制代码

安装Beautiful Soup程序员

pip install beautifulsoup4复制代码

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

sudo pip install beautifulsoup4复制代码

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

index.py文件app

# 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)
            #只放入.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来作一个简单的爬虫,爬取线上指定数据并保存在本地。好了今天就到这。dom

谢谢你们,小弟才开始写博客有错误的地方但愿多多指正。函数

相关文章
相关标签/搜索