使用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

謝謝你們,小弟纔開始寫博客有錯誤的地方但願多多指正。函數

相關文章
相關標籤/搜索