BeautifulSoup模塊學習文檔

1、BeautifulSoup簡介

1.BeautifulSoup模塊

Beautiful Soup 是一個能夠從HTML或XML文件中提取數據的Python庫.它可以經過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式html

2.安裝

在python3版本中安裝BeautifulSouphtml5

pip install BeautifulSoup4

也能夠經過下載BS4的源碼,經過setup.py來安裝python

3.Beautiful解析器安裝

主要的幾個解析器:瀏覽器

  • bs4的HTML解析器-->BeautifulSoup(mk,'html.parser')-->安裝bs4庫markdown

  • lxml的HTML解析器-->BeautifulSoup(mk,'lxml')-->pip install lxml框架

  • lxml的XML解析器-->BeautifulSoup(mk,'xml')-->pip install lxmlide

  • html5lib的解析器-->BeautifulSoup(mk,'html5lib')-->pip installl html5lib函數

解析器 使用方法 優點 劣勢
Python標準庫 BeautifulSoup(markup, "html.parser") 1.Python的內置標準庫2.執行速度適中3.文檔容錯能力強 Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 1.速度快2.文檔容錯能力強 須要安裝C語言庫
lxml XML 解析器 BeautifulSoup(markup, ["lxml-xml"])/BeautifulSoup(markup, "xml") 1.速度快2.惟一支持XML的解析器 須要安裝C語言庫
html5lib BeautifulSoup(markup, "html5lib") 1.最好的容錯性2.以瀏覽器的方式解析文檔3.生成HTML5格式的文檔 1.速度慢2.不依賴外部擴展

推薦使用lxml做爲解析器,效率高。測試

Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,其中一個是 lxml .根據操做系統不一樣,能夠選擇下列方法來安裝lxml。this

pip install lxml

2、BeautifulSoup快速使用

1.beautifulSoup使用方法

解析原理:

  • 實例化一個BeautifulSoup對象,且將即將被解析的頁面源碼加載到該對象中

  • 使用該對象中的屬性或方法進行標籤訂位和數據提取

解析方式:

  • BeautifulSoup(fp,"lxml"),lxml指定解析器,將本地存儲的html文檔加載到該對象中

  • BeautifulSoup(page_text,"lxml"),將互聯網上獲取的html源碼加載到該對象中

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>', 'html.parser')

2.BeautifulSoup庫的基本元素

BeautifulSoup類和html文檔標籤樹的關係

BeautifulSoup庫是解析、遍歷、維護「標籤樹」的功能庫

BeautifulSoup對象和文檔樹是對應的

BeautifulSoup類的基本元素

  • Tag:標籤,最基本的信息組織單元,分別用<>和</>標明開頭和結尾

  • Name:標籤的名字,<p></p>的名字是'p',格式:<tag>.name

  • Attributes:標籤的屬性,字典形式組織,格式:<tag>.attrs

  • NavigableString:標籤內非屬性字符串,<>…</>中字符串,格式:<tag>.string

  • Comment:標籤內字符串的註釋部分,一種特殊的Comment類型

3.BeautifulSoup對象標籤訂位

本地文件test.html

<html lang="en">
<head>
<meta charset="utf-8"/>
<title>測試bs4</title>
</head>
<body>
<div>
<p>百里守約</p>
</div>
<div class="song">
<p>李清照</p>
<p>王安石</p>
<p>蘇軾</p>
<p>柳宗元</p>
<a href="http://www.song.com/" target="_self" title="趙匡胤">
<span>this is span</span>
        宋朝是最強大的王朝,不是軍隊的強大,而是經濟很強大,國民都頗有錢</a>
<a class="du" href="">總爲浮雲能蔽日,長安不見令人愁</a>
<img alt="" src="http://www.baidu.com/meinv.jpg"/>
</div>
<div class="tang">
<ul>
<li><a href="http://www.baidu.com" title="qing">清明時節雨紛紛,路上行人慾斷魂,借問酒家何處有,牧童遙指杏花村</a></li>
<li><a href="http://www.163.com" title="qin">秦時明月漢時關,萬里長征人未還,但使龍城飛將在,不教胡馬度陰山</a></li>
<li><a alt="qi" href="http://www.126.com">岐王宅裏尋常見,崔九堂前幾度聞,正是江南好風景,落花時節又逢君</a></li>
<li><a class="du" href="http://www.sina.com">杜甫</a></li>
<li><a class="du" href="http://www.dudu.com">杜牧</a></li>
<li><b>杜小月</b></li>
<li><i>度蜜月</i></li>
<li><a href="http://www.haha.com" id="feng">鳳凰臺上鳳凰遊,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li>
</ul>
</div>
</body>
</html>
test.html

利用lxml解析成soup對象

from bs4 import BeautifulSoup
fp = open("./test.html","r",encoding="utf-8")
soup = BeautifulSoup(fp,"lxml")

TagName

Tag 對象與XML或HTML原生文檔中的tag相同

  • soup.tagName:返回的是頁面中第一次出現的tagName標籤,(一個單數)

tag = soup.title
type(tag)
# <title>測試bs4</title>

標籤對象的那麼屬性:每一個tag都有本身的名字,經過 .name 來獲取

tag.name
# u'title'

soup.find方法:屬性定位

一個tag可能有不少個屬性. tag <b class="boldest"> 有一個 「class」 的屬性,值爲 「boldest」 . tag的屬性的操做方法與字典相同

  • soup.find("tagName",attrName="value")

  • 注意:返回的是單數

tag = soup.find("div",class_="song")  # 由於class爲關鍵字,因此改成class_

tag對象能夠直接「點」取屬性,好比:.attrs

tag.attrs
# {u'class': u'song'}

soup.find_all()方法

  • soup.find_all("tagName"):定位全部的tagName的標籤

  • soup.find_all("tagName",attrName="value"):屬性定位

    • 注意:返回值是列表

soup.find_all("div")
soup.find_all("div",class_="song")

soup.select()方法

select("選擇器"):根據選擇器進行標籤訂位且返回的是複數(列表)

  • 標籤選擇器,id選擇器,類選擇器,屬性選擇器,層級選擇器

  • 層級選擇器:>表示一個層級,空格表示多個層級

soup.select(".tang")

層級選擇

# soup.select(".tang li")
soup.select(".tang > ul > li")  # 二者效果相同

4.BeautifulSoup對象數據提取

string和text

string:獲取找到的標籤中第一個標籤的文本

soup.p.string # 獲取第一個p標籤的文本 # '百里守約' 

text:獲取找到的標籤中第一個標籤的文本

soup.p.text  # 獲取第一個p標籤的文本
# '百里守約'

區別:

  • string獲取的是標籤中只存在文本的直系文本內容,

  • text獲取的是標籤中全部的文本內容

獲取標籤屬性

tag["attrName"]

for a in soup.select(".tang > ul > li > a"):
    print(a["href"])
    
http://www.baidu.com
http://www.163.com
http://www.126.com
http://www.sina.com
http://www.dudu.com
http://www.haha.com

bs4庫的html輸出格式

bs4的prettify方法:爲html文內容添加換行符,是文本格式更加清晰

soup.prettify 

3、BeautifulSoup遍歷方法

html基本格式

1.標籤樹的下行遍歷

.contents:子節點的列表,將<tag>全部兒子節點存入列表 .children:子節點的迭代類型,與.contents相似,用於循環遍歷兒子節點 .descendants:子孫節點的迭代類型,包含全部子孫節點,用於循環遍歷

for child in soup.body.children:  # 遍歷兒子節點
    print(child)
for child in soup.body.descendants:  # 遍歷子孫節點
    print(child)

2.標籤樹的上行遍歷

.parent:節點的父親標籤 .parents:節點先輩標籤的迭代類型,用於循環遍歷先輩節點

代碼框架

soup = BeautifulSoup(demo, "html.parser")
    for parent in soup.a.parents:
        if parent is None:
            print(parent)
        else:
            print(parent.name)

3.標籤樹的平行遍歷

.next_sibling:返回按照HTML文本順序的下一個平行節點標籤 .previous_sibling:返回按照HTML文本順序的上一個平行節點標籤 .next_siblings:迭代類型,返回按照HTML文本順序的後續全部平行節點標籤 .previous_siblings:迭代類型,返回按照HTML文本順序的前續全部平行節點標籤

4、信息組織與提取方法

1.信息標記的三種形式:

1.XML:eXtensible Markup Language

標籤內容的表達形式:

<name>   …   </name>    標籤中有內容
<name/>    標籤中沒有內容
<!--           -->    註釋表達方式

2.JSON:JavsScript Object Notation

  • 有類型的鍵值對 key:value,"name":"北京理工大學"

  • 鍵值對的值有多個:"name":["北京理工大學","延安天然科學院"]

  • 鍵值對的嵌套使用

3.YAML:YAML Ain't Markup Language

  • 無類型鍵值對key:value name:北京理工大學

  • 鍵值對的值有多個:「-」表達並列關係

  • 鍵值對的嵌套使用:用縮進表達所屬關係

  • | 表達整塊數據,#表示註釋

2.三種信息標記形式的比較

  • XML:最先的通用信息標記語言,可擴展性好,但繁瑣

Internet上的信息交互與傳遞

  • JSON:信息有類型,適合程序處理(js),較XML簡潔

移動應用雲端和節點的信息通訊,無註釋,優點:在通過傳輸後可以做爲程序代碼的一部分,缺點:沒法體現註釋

  • YAML:信息無類型,文本信息比例最高,可讀性好

用於各種系統的配置文件,有註釋易讀

3.信息提取的通常方法

方法一:完整解析信息的標記形式,在提取關鍵信息

  • 標記解析器解析:XML JSON YAML

  • 須要標記解析器,如:bs4庫的標籤樹遍歷

  • 優勢:信息解析準確

  • 提取過程繁瑣,速度慢

方法二:無視標記形式,直接搜索關鍵信息

  • 搜索:對信息的文本產找函數便可

  • 優勢:提取過程簡潔,速度較快

  • 缺點:提取結果準確性與信息內容相關

融合方法:結合形式解析和搜索方法,提取關鍵信息

  • 須要表及解析器及文本查找函數

實例:

  • 提取HTML中全部URL連接

  • 思路:

    • 搜索到全部<a>標籤

    • 解析<a>標籤格式,提取herf後的連接內容

相關文章
相關標籤/搜索