日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

python 分析html_用python的BeautifulSoup分析html

發(fā)布時(shí)間:2024/1/23 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 分析html_用python的BeautifulSoup分析html 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘自? ?http://www.cnblogs.com/twinsclover/archive/2012/04/26/2471704.html

序言

之前用python爬取網(wǎng)頁(yè)的時(shí)候,一直用的是regex或者自帶的庫(kù)sgmllib里的SGMLParser。但是遇到復(fù)雜一點(diǎn)的情況時(shí),SGMLParser往往就不那么給力了!(哈,難道說(shuō)我 too native了?畢竟beautifulSoup是繼承sgmlparser的么~)所以,我尋尋覓覓尋尋覓覓,發(fā)現(xiàn)了BeautifulSoup這么個(gè)玩意。BeautifulSoup提供了很人性化的parser tree,有了它,我們可以簡(jiǎn)單的抽取出tagname, attrs, text等等等等...

入門

(ps:其實(shí)入門什么的看官方文檔是最好的了,這里只是記錄一下簡(jiǎn)單的用法。)

首先先介紹實(shí)際工作中最常用的幾個(gè)方法:

舉例的html代碼(就用官方例子好了):

1

2

3

Page title

4

5

6

7 This is paragraphone.

8

9

10 This is paragraphtwo.

11

12

13

0、初始化:

1 soup = BeautifulSoup(html) # html為html源代碼字符串,type(html) == str

1、用tag獲取相應(yīng)代碼塊的剖析樹(shù):

既然要分析html,首先要找到對(duì)我們有用的tag塊,beautiful提供了非常便利的方式。

#當(dāng)用tag作為搜索條件時(shí),我們獲取的包含這個(gè)tag塊的剖析樹(shù):

#ooo

#這里獲取head這個(gè)塊

head = soup.find('head')

# or

# head = soup.head

# or

# head = soup.contents[0].contents[0]

運(yùn)行后,我們會(huì)得到:

1

2

Page title

3

這里小燈我還是推薦使用第二種方法,find方法在當(dāng)前tag剖析樹(shù)(當(dāng)前這個(gè)html代碼塊中)尋找符合條件的子樹(shù)并返回。find方法提供多種查詢方式,包括用喜聞樂(lè)見(jiàn)的regex哦~之后會(huì)詳細(xì)介紹。

contents屬性是一個(gè)列表,里面保存了該剖析樹(shù)的直接兒子。

如:

1 html = soup.contents[0] # ...

2 head = html.contents[0] #

...

3 body = html.contents[1] #

...

2、用contents[], parent, nextSibling, previousSibling尋找父子兄弟tag

為了更加方便靈活的分析html代碼塊,beautifulSoup提供了幾個(gè)簡(jiǎn)單的方法直接獲取當(dāng)前tag塊的父子兄弟。

假設(shè)我們已經(jīng)獲得了body這個(gè)tag塊,我們想要尋找,

, 第一個(gè)

, 第二個(gè)

這四個(gè)tag塊:

# body = soup.bodyhtml = body.parent # html是body的父親

head = body.previousSibling # head和body在同一層,是body的前一個(gè)兄弟

p1 = body.contents[0] # p1, p2都是body的兒子,我們用contents[0]取得p1

p2 = p1.nextSibling # p2與p1在同一層,是p1的后一個(gè)兄弟, 當(dāng)然body.content[1]也可得到

print p1.text

# u'This is paragraphone.'

print p2.text

# u'This is paragraphtwo.'

# 注意:1,每個(gè)tag的text包括了它以及它子孫的text。2,所有text已經(jīng)被自動(dòng)轉(zhuǎn)

#為unicode,如果需要,可以自行轉(zhuǎn)碼encode(xxx)

然而,如果我們要尋找祖先或者孫子tag怎么辦呢?? 用while循環(huán)嗎? 不, beautifulsoup已經(jīng)提供了方法。

3、用find, findParent, findNextSibling, findPreviousSibling尋找祖先或者子孫 tag:

有了上面的基礎(chǔ),這里應(yīng)該很好理解了,例如find方法(我理解和findChild是一樣的),就是以當(dāng)前節(jié)點(diǎn)為起始,遍歷整個(gè)子樹(shù),找到后返回。

而這些方法的復(fù)數(shù)形式,會(huì)找到所有符合要求的tag,以list的方式放回。他們的對(duì)應(yīng)關(guān)系是:find->findall, findParent->findParents, findNextSibling->findNextSiblings...

如:

1 print soup.findAll('p')

2 # [

This is paragraph one.

,

This is paragraph two.

]

這里我們重點(diǎn)講一下find的幾種用法,其他的類比:

find(name=None, attrs={}, recursive=True, text=None, **kwargs)

1) 搜索tag:

1 find(tagname) # 直接搜索名為tagname的tag 如:find('head')

2 find(list) # 搜索在list中的tag,如: find(['head', 'body'])

3 find(dict) # 搜索在dict中的tag,如:find({'head':True, 'body':True})

4 find(re.compile('')) # 搜索符合正則的tag, 如:find(re.compile('^p')) 搜索以p開(kāi)頭的tag

5 find(lambda) # 搜索函數(shù)返回結(jié)果為true的tag, 如:find(lambda name: if len(name) == 1) 搜索長(zhǎng)度為1的tag

6 find(True) # 搜索所有tag

2) 搜索屬性(attrs):

1 find(id='xxx') # 尋找id屬性為xxx的

2 find(attrs={id=re.compile('xxx'), algin='xxx'}) # 尋找id屬性符合正則且algin屬性為xxx的

3 find(attrs={id=True, algin=None}) # 尋找有id屬性但是沒(méi)有algin屬性的

3) 搜索文字(text):

注意,文字的搜索會(huì)導(dǎo)致其他搜索給的值如:tag, attrs都失效。

方法與搜索tag一致

4) recursive, limit:

recursive=False表示只搜索直接兒子,否則搜索整個(gè)子樹(shù),默認(rèn)為True。

當(dāng)使用findAll或者類似返回list的方法時(shí),limit屬性用于限制返回的數(shù)量,如findAll('p', limit=2): 返回首先找到的兩個(gè)tag

*4、用next,previous尋找上下文tag(少用)

這里我們主要看看next, next是取得當(dāng)前的tag的下一個(gè)(按代碼從上到下的順序)tag塊。這與contents是不一樣的,千萬(wàn)別混淆了哦^ ^

我們舉個(gè)栗子來(lái)看看

1

2 a

3 b

4 c

5

我們看看next的實(shí)際效果:

1 a = soup.a

2 b = soup.b

3 n1 = b.next

4 n2 = n1.next

輸出一下:

1 print a.next

2 # u'a'

3 print n1

4 # u'b'

5 print n2

6 # c

所以,next僅僅是獲取文檔上的“下一個(gè)”的tag,和剖析樹(shù)中的位置無(wú)關(guān)。

當(dāng)然也有findNext和findAllNext方法。

至于previous, 表示上一個(gè)tag塊,就類比一下吧~^ ^

總結(jié)

以上是生活随笔為你收集整理的python 分析html_用python的BeautifulSoup分析html的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。