嗯哼,Meego中文核心站-- 米趣網(wǎng) 又發(fā)新博文啦,。
前面向大家介紹了 PyQuery ,下面轉(zhuǎn)而介紹一下 BeautifulSoup , Beautiful Soup 是 Python 內(nèi)置的網(wǎng)頁(yè)分析工具,,名字叫美麗的蝴蝶。呵呵,,某些時(shí)候確如美麗蝴蝶一樣,。
先來(lái)段介紹:
Beautiful Soup 是一個(gè) Python HTML/XML 處理器,設(shè)計(jì)用來(lái)快速地轉(zhuǎn)換網(wǎng)頁(yè)抓取,。以下的特性支撐著 Beautiful Soup:
- Beautiful Soup 不會(huì)選擇 即使你給他一個(gè)損壞的標(biāo)簽,。 他產(chǎn)生一個(gè)轉(zhuǎn)換DOM樹(shù),盡可能和你原文檔內(nèi)容含義一致 ,。這種措施通常能夠你搜集數(shù)據(jù)的需求,。
- Beautiful Soup 提供一些簡(jiǎn)單的方法以及類Python語(yǔ)法 來(lái)查找、查找,、修改一顆轉(zhuǎn)換樹(shù):一個(gè)工具集幫助你解析一棵樹(shù)并釋出你需要的內(nèi)容,。你不需要為每一個(gè)應(yīng)用創(chuàng)建自己的解析工具。
- Beautiful Soup 自動(dòng)將送進(jìn)來(lái)的文檔轉(zhuǎn)換為 Unicode 編碼 而且在輸出的時(shí)候轉(zhuǎn)換為 UTF-8,,。 除非這個(gè)文檔沒(méi)有指定編碼方式或者Beautiful Soup 沒(méi)能自動(dòng)檢測(cè)編碼,,你需要手動(dòng)指定編碼方式,否則你不需要考慮編碼的問(wèn)題,。
Beautiful Soup 轉(zhuǎn)換任何你給他的內(nèi)容,,然后為你做那些轉(zhuǎn)換的事情。你可以命令他 “找出所有的鏈接", 或者 "找出所有 class 是 externalLink 的鏈接" , 再或者是 "找出所有的鏈接 url 匹配 ”foo.com", 甚至是 "找出那些表頭是粗體文字,,然后返回給我文字“.
那些設(shè)計(jì)不好的網(wǎng)站中的有價(jià)值的數(shù)據(jù)可以被你一次鎖定,,原本要花數(shù)個(gè)小時(shí)候的工作,通過(guò)使用 Beautiful Soup 可以在幾分鐘內(nèi)搞定,。
下面讓我們快速開(kāi)始:
首先引用包:
- from BeautifulSoup import BeautifulSoup # For processing HTML
- from BeautifulSoup import BeautifulStoneSoup # For processing XML
- import BeautifulSoup # To get everything[/font][/color]
復(fù)制代碼 下面使用一段代碼演示Beautiful Soup的基本使用方式,。你可以拷貝與粘貼這段代碼自己運(yùn)行。
- from BeautifulSoup import BeautifulSoup
- import re
- doc = ['<html><head><title>Page title</title></head>',
- '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.',
- '<p id="secondpara" align="blah">This is paragraph <b>two</b>.',
- '</html>']
- soup = BeautifulSoup(''.join(doc))
- print soup.prettify()
- # <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>
- # </body>
- # </html>
復(fù)制代碼下面是一個(gè)解析文檔的方法:
- soup.contents[0].name
- # u'html'
- soup.contents[0].contents[0].name
- # u'head'
- head = soup.contents[0].contents[0]
- head.parent.name
- # u'html'
- head.next
- # <title>Page title</title>
- head.nextSibling.name
- # u'body'
- head.nextSibling.contents[0]
- # <p id="firstpara" align="center">This is paragraph <b>one</b>.</p>
- head.nextSibling.contents[0].nextSibling
- # <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>
復(fù)制代碼接著是一打方法查找一文檔中包含的標(biāo)簽,,或者含有指定屬性的標(biāo)簽
- titleTag = soup.html.head.title
- titleTag
- # <title>Page title</title>
- titleTag.string
- # u'Page title'
- len(soup('p'))
- # 2
- soup.findAll('p', align="center")
- # [<p id="firstpara" align="center">This is paragraph <b>one</b>. </p>]
- soup.find('p', align="center")
- # <p id="firstpara" align="center">This is paragraph <b>one</b>. </p>
- soup('p', align="center")[0]['id']
- # u'firstpara'
- soup.find('p', align=re.compile('^b.*'))['id']
- # u'secondpara'
- soup.find('p').b.string
- # u'one'
- soup('p')[1].b.string
- # u'two'
復(fù)制代碼當(dāng)然也可以簡(jiǎn)單地修改文檔
- titleTag['id'] = 'theTitle'
- titleTag.contents[0].replaceWith("New title")
- soup.html.head
- # <head><title id="theTitle">New title</title></head>
- soup.p.extract()
- soup.prettify()
- # <html>
- # <head>
- # <title id="theTitle">
- # New title
- # </title>
- # </head>
- # <body>
- # <p id="secondpara" align="blah">
- # This is paragraph
- # <b>
- # two
- # </b>
- # .
- # </p>
- # </body>
- # </html>
- soup.p.replaceWith(soup.b)
- # <html>
- # <head>
- # <title id="theTitle">
- # New title
- # </title>
- # </head>
- # <body>
- # <b>
- # two
- # </b>
- # </body>
- # </html>
- soup.body.insert(0, "This page used to have ")
- soup.body.insert(2, " <p> tags!")
- soup.body
- # <body>This page used to have <b>two</b> <p> tags!</body>
復(fù)制代碼最后,,為大家提供 Beautiful Soup 的文檔。希望能對(duì)您有幫助,。