BeautifulSoup中一些函數的用法歸納

BeautifulSoup作爲一個強大的從HTML或則XML文件中提取數據的Python庫,它能通過解析文檔爲用戶提供需要抓取的數據。同時,它可以很好的處理不規範標記並生成剖析樹(parse tree)並提供簡單又常用的導航(navigating),搜索以及修改剖析樹的操作。它可以大大節省你的編程時間。
接下來歸納一下之前在看書過程中發現的一些不懂的對數據爬取得方法

先給出官方文檔:http://beautifulsoup.readthedocs.io/zh_CN/latest/

解釋器
Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,其中包括 lxml 和 html5lib 。可以通過pip或easy_install來安裝這兩個解釋器。這幾者之間的差別見這裏。

BeautifulSoup介紹

首先,Beautifulsoup將複雜的HTML或者XML文件解析成複雜的樹形結構,每個節點都是Python對象,所有的4個節點可以分爲:Tag,NavigableString,BeautifulSoup,Comment。

TAG

Tag與HTML原生文檔中的Tag標籤一致
例如:
soup=BeautifulSoup('<title>Page title</title>','html.parser')
a=soup.title
print(a)

輸出結果爲<title>Page title</title>

Tag中有兩個重要的屬性:name和attributes.

1.name:

每個Tag都有自己的名字,例如同樣是上面的例子:
soup=BeautifulSoup('<title>Page title</title>','html.parser')
a=soup.title
a=a.name
print(a)

輸出結果:title
總結:Tag的name屬性即爲標籤的名字,可以通過’.’操作符進行訪問

2.attributes:

attributes代表的是Tag標籤內的屬性,例如:
soup=BeautifulSoup('<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>','html.parser')
a=soup.p
a=a['id']
print(a)

輸出結果爲:firstpara
同時,Python提供了attrs方法以字典的形式返回Tag內的所有屬性。例如:
soup=BeautifulSoup('<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>','html.parser')
a=soup.p
a=a.attrs
print(a)

輸出結果爲:{'id': 'firstpara', 'align': 'center'}

既然我們已經得到了標籤的內容,那麼要想獲取標籤內部的文字怎麼辦呢?很簡單,用 .string 即可,例如

soup=BeautifulSoup('<p id="firstpara" align="center">This is paragraph </p>','html.parser')
a=soup.string
print(a)

輸出結果爲:This is paragraph

它的類型是一個 NavigableString,翻譯過來叫 可以遍歷的字符串,不過我們最好還是稱它英文名字吧
BeautifulSoup

BeautifulSoup

BeautifulSoup對象表示的是一個文檔的全部內容。大部分時候,可以把它當作 Tag 對象,它支持遍歷文檔樹和搜索文檔樹中描述的大部分的方法.

因爲 BeautifulSoup 對象並不是真正的HTML或XML的tag,所以它沒有name和attribute屬性。但有時查看它的.name 屬性是很方便的,所以 BeautifulSoup 對象包含了一個值爲[document]的特殊屬性 .name
例如:
soup=BeautifulSoup('<li id="firstpara" align="center">This is paragraph <b>one</b>.</li>','html.parser')
a=soup.name
print(a)

輸出結果爲:[document]

Comment

Comment 對象是一個特殊類型的 NavigableString 對象:

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
輸出結果爲:<class 'bs4.element.Comment'>

b標籤裏的內容實際上是註釋,但是如果我們利用 .string 來輸出它的內容,我們發現它已經把註釋符號去掉了,所以這可能會給我們帶來不必要的麻煩。

另外我們打印輸出下它的類型,發現它是一個 Comment 類型,所以,我們在使用前最好做一下判斷,判斷代碼如下
if type(soup.b.string)==bs4.element.Comment:
print soup.a.string

BeautifulSoup中常用方法總結

1.parent 方法

上面說到過,BeautifulSoup將複雜的HTML或者XML文件解析成複雜的樹形結構,每個節點都是Python對象。所以parent方法顧名思義,代表的是父節點。通過.parent可以訪問某標籤的上一個標籤
例如:
doc = ['<html><head><title>Page title</title></head>',
'<body><p id="firstpara" align="center">This is paragraph <b>one</b>.</p>',
'<p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>',
'<p id="secondpara" align="blah">This is paragraph <b>three</b>.</p>'
'</html>']
soup = BeautifulSoup(''.join(doc),'html.parser')
v=soup.p
c=v.parent.name

print(c)
輸出結果爲body
從doc中可以看出p標籤的上一個標籤(父標籤)爲body

2.contents方法

parent方法用於向上遍歷樹節點,contents方法用於向下遍歷樹節點,即向下訪問某節點的子節點。
tag的.contents 屬性可以將tag的子節點以列表的方式輸出。
例如同樣是上面的例子:
soup = BeautifulSoup(''.join(doc),'html.parser')
v=soup.p
c=v.contents
print(c)

輸出結果爲:['This is paragraph ', <b>one</b>, '.']

又如:soup = BeautifulSoup(”.join(doc),’html.parser’)
v=soup.head
a=v.contents
b=v.contents[0]
c=b.contents
print(a)
print(b)
print(c)

輸出結果爲:[<title>Page title</title>]
<title>Page title</title>
['Page title']

b=v.contents[0]這一行代碼中,因爲v.contents返回的是列表,所以不能直接用a.contents取出標籤title中的內容,只能將列表中的Tag取出,在訪問子節點。

3.string方法

爲了方便,如果一個標籤只有一個子節點,而且該子節點還是字符串類型的,則該子節點可以通過tag.string的形式訪問。同時,如果一個節點僅有一個子節點,則該子節點也可以用.string進行訪問,輸出結果與當前唯一子節點的 .string 結果相同。
例如:
soup = BeautifulSoup(''.join(doc),'html.parser')
v=soup.b
b=v.string
print(b)

輸出結果爲:one
soup.b返回包含標籤b的字典。因爲b標籤僅有一個子節點,且該子節點是字符串類型(同時也滿足僅有一個子節點的條件),所以可以直接用.string方法訪問該子節點。

注意:soup.p.string返回的是None,因爲p標籤的子節點並不是只有一個,而是有多個子節點,這時候不滿足使用string的條件,所以會返回None。同時雖然<HEAD> Tag只有一個子節點,但是這個子節點是Tag類型 (<TITLE> Tag), 不是NavigableString。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章