用字符串建立BeautifulSoup對象
向構造器中傳遞一個字符串建立對象,如:
helloworld = "<p>Hello World</p>"
soup_string = BeautifulSoup(helloworld)
上述建立對象被當作HTML文檔處理,可使用print(soup_string)打印,輸出爲:
<p>hello world</p> (PS:輸出結果與系統有關,有可能爲<html><body><p>Helloworld</p></body></html>)
在建立對象過程當中,輸入被所支持的語法解析器轉換爲一個樹結構體。因此,輸入會被當作不一樣的BeautifulSoup對象(如BeautifulSoup,Tag,NavigableString).
用類文件對象建立BeautifulSoup對象
類文件對象在解析在線網頁時很是有用,是BeautifulSoup中最多見的對象。
好比咱們要獲得一個圖書銷售網站全部圖書列表,此網頁爲http://www.packtpub.com/books。爲了減小過於的訪問好比使用字符串來得到網頁內容,咱們可使用關於URL的類文件對象來建立BeautifulSoup對象。如:
import urllib2
from bs4 import BeautifulSoup
url = "http://www.packtpub.com/books"
page = urllib2.urlopen(url)
soup_packtpage = BeautifulSoup(page)
urllib2.urlopen()方法由輸入的URL返回一個類文件對象,而後以此建立BeautifulSoup對象。
類似的,咱們能夠爲本地文件建立一個文件對象用於構造BeautifulSoup。好比在本地文件Soup中有個foo.html文件,建立BeautifulSoup對象方式以下:
with open("foo.html","r") as foo_file:
soup_foo = BeautifulSoup(foo_file)
BeautifulSoup會有警告若是咱們建立對象時傳遞的是文件名而不是文件對象時,好比:
soup_foo = BeautifulSoup("foo.html")
警告以下:
UserWarning: "foo.html" looks like a filename, not markup. You
should probably open this file and pass the filehandle into
Beautiful Soup.
可是Beautiful仍然會將"foo.html"當作字符串處理。
一樣的若是咱們傳遞一個URL代替URL文件對象的話,也會被當作字符串處理。
用XML解析器建立BeautifulSoup對象
當建立一個BeautifulSoup對象時,TreeBuliders類被用於建立HTML/XML樹,默認的是使用HTML TreeBuliders對象,使用HTML解析器。若是咱們想把輸入當作XML作解析,咱們必須明確的使用features參數在BeatufulSoup對象構造器中進行說明。指定features參數,咱們可以選擇最合適的TreeBuliders來知足咱們的需求。
理解features參數
被不一樣的TreeBuliders使用的解析器有如下三種:
- lxml
- html5lib
- html.parser
features參數能夠是字符串列表或者一個字符串。目前每一個TreeBuliders和潛在的解析器支持的特性描述以下:html
在HTML文檔中TreeBuliders的選擇是基於解釋器建立的優先級。首先是lxml,而後是html5lib,最後是html.parser。好比咱們提供html當作features參數。BeautifulSoup會選擇LXMLTreeBuilder,若是lxml解析器有效。若是lxml解析器無效,則選擇HTML5TreeBulider基於html5lib對象,依次類推。
好比咱們能夠指定features參數把輸入當作XML進行處理:
soup_xml = BeautifulSoup(helloworld,features= "xml")
也能夠這樣寫:
soup_xml = BeautifulSoup(helloworld,"xml")
PS:若是本地沒有XML解析器,則會報錯。個人電腦就報錯了。
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
soup_xml = BeautifulSoup(helloworld, "xml")
File "C:\Python33\lib\site-packages\bs4\__init__.py", line 152, in __init__
% ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
建議建立BeautifulSoup對象的時候就指定解析器。由於不一樣的解析器解析的內容不一樣。在咱們給出一個無效的HTML文檔內容時更是如此。
當建立BeautifulSoup對象時,其它對象也會跟着被建立,包括:
Tag
Tag對象表明了HTML和XML文檔中不一樣的標籤。當解析這些文檔時Tag對象被建立。此對象擁有HTML/XML文檔標籤的屬性和內容,此對象能夠用戶搜索和定位HTML/XML文檔內容。html5
從Beautifulsoup中得到Tag對象
咱們能夠與任何標籤打交道。好比咱們得到一下例子中的第一個<a>標籤經過簡單的調用標籤<a>。python
html_atag = """<html><body><p>Test html a tag example</p>
<a href="http://www.packtpub.com'>Home</a>
<a href="http;//www.packtpub.com/books'>Books</a>
</body>
</html>"""
soup = BeautifulSoup(html_atag,'lxml')
atag = soup.a
print(atag)
Tag對象可讓咱們得到HTML標籤相關的名字和屬性。
Tag對象的名字
Tag對象的名字經過.name訪問web
tagname = atag.name
print tagname
也能夠經過.name更改標籤名
atag.name = 'p'
print(soup)
#output
<html><body><p>Test html a tag example</p>
<p href="http://www.packtpub.com'>Home</p>
<a href="http://www.packtpub.com/books'>Books</a>
</body></html>
能夠看見<a>變成了<p>
Tag對象的屬性
屬性給予標籤意義和內容。好比標籤有類別,ID號和風格。tag的屬性能夠把Tag對象看成字典來獲取。shell
atag = soup_atag.a
print (atag['href'] )
#output
http://www.packtpub.com
標籤的不一樣屬性均可以經過.attrs來訪問。
print(atag.attrs) 將會獲得 {'href':' http://www.packtpub.com'}ide
NavigableString對象
NavigableString對象包含HTML或XML標籤中的文字內容。這是一個Python Unicode字符串,用來尋找或導航定位。有時咱們會基於當前文本內容定位其餘標籤或其餘文本內容。
網站
得到一個標籤儲存的文本內容能夠經過使用.string訪問ui
first_a_string = soup_atag.string
this
上訴就建立了一個NavigableString對象,裏面是第一個<a>標籤中的字符串u'Home'。url