1. 程式人生 > >BeautifulSoup中一些函式的用法歸納

BeautifulSoup中一些函式的用法歸納

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

直譯器
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。