




手動獲取源代碼


我們也可以用requests方法來獲取網(wǎng)頁的html信息
我們輸入import requests ,然后用get函數(shù)來獲得這個(gè)鏈接所對應(yīng)的內(nèi)容
顯示一下這個(gè)文本,這時(shí)候顯示的就是這個(gè)頁面的html內(nèi)容
我們可以定義一個(gè)變量demo來簡化一下,令 demo = r.text
下面對beautifulsoup庫進(jìn)行一個(gè)小測,輸入 from bs4 import BeautifulSoup?
盡管我們安裝這個(gè)庫的時(shí)候安裝的是beautifulsoup4 ,但是我們使用的時(shí)候用的是它的簡寫bs4
所以我們 from bs4這個(gè)庫,然后導(dǎo)入了一個(gè)類叫做?BeautifulSoup (注意B和S都要大寫)
下面就是把這個(gè)demo頁面變成這個(gè)BeautifulSoup能夠理解的湯
我們有個(gè)變量叫 soup = BeautifulSoup(demo , “html.parser”)
我們除了給出demo,還要給出一個(gè)解釋demo的解釋器,這里面我們解釋器選擇的是html.parser
也就是說我們對demo進(jìn)行html的解析
下面我們用print來檢查我們的解析是否正確,也就是檢查我們的庫安裝是否正確
print(soup.prettify())
這個(gè)相關(guān)內(nèi)容輸出了說明我們beautifulsoup庫成功的解析了相關(guān)頁面


簡單來說,使用beautifulsoup庫只需要兩個(gè)代碼
第一行這里面的 BeautifulSoup 是一個(gè)類,B 和 S 要大寫
然后我們要做一鍋湯,可以定義一個(gè)變量soup(也可以是其他變量名)
BeautifulSoup這個(gè)類型有兩個(gè)參數(shù)
第一個(gè)參數(shù)是我們需要BeautifulSoup解析的一個(gè)html格式的信息,我們可以用'<p>data</p>來做個(gè)代替,同時(shí)我們也能用任何的變量如demo
同時(shí)我們也給出了解析這鍋湯所使用的解析器,這里使用的html.parser
只用兩個(gè)代碼我們就能夠看到的html和sml信息
Beautifulsoup庫的基本元素

打開任何html文件的源代碼可以看到它是由一系列尖括號構(gòu)成的標(biāo)簽組織起來的
這里面每一個(gè)尖括號形成了一個(gè)標(biāo)簽,而標(biāo)簽之間每一對標(biāo)簽形成了一個(gè)上下游關(guān)系,形成了一個(gè)標(biāo)簽樹
只要提交的文件是標(biāo)簽類型,那么Beautifulsoup庫都能對它做很好的解析
接下來我們看一下每一個(gè)標(biāo)簽的具體格式
這里面我們以p標(biāo)簽為例
p標(biāo)簽是以一對尖括號形成的標(biāo)簽類型,它的名字是p



這三著是等價(jià)的

我們也可以通過打開文件的方式為BeautifulSoup類提供html或sml的文檔內(nèi)容

下面介紹獲得tag標(biāo)簽的主要方法

下面介紹獲得標(biāo)簽名字的方法

我們可以通過對任何一個(gè)標(biāo)簽使用.name的方式獲得它的名字,這個(gè)名字顯示出來是字符串類型

標(biāo)簽屬性是在標(biāo)簽中表明標(biāo)簽相關(guān)特點(diǎn)的相關(guān)區(qū)域,它以字典形式來組織
假設(shè)這個(gè)時(shí)候湯已經(jīng)做好了,我們選擇a標(biāo)簽來做測試
我們用 .attrs 來獲得標(biāo)簽屬性,可以看到打印出了一個(gè)字典,字典中給出了這個(gè)標(biāo)簽屬性中它的標(biāo)簽名字,屬性名字和屬性的值之間的對應(yīng)關(guān)系
比如說,這里面我們要獲取class屬性的值,我們可以這樣來實(shí)現(xiàn)
tag.attrs['class']
我們看到class屬性的值是一個(gè)列表列表類型中的第一個(gè)元素是‘py1’
我們也可以獲得a標(biāo)簽的鏈接屬性 tag.attrs['href'],這個(gè)時(shí)候a標(biāo)簽打印出了一個(gè)鏈接
接下來我們看一下標(biāo)簽屬性的類型,我們看到標(biāo)簽屬性是個(gè)字典類型
標(biāo)簽是個(gè)標(biāo)簽類型
在bs4庫中為標(biāo)簽定義了一種bs4
庫認(rèn)可的類型
tag的標(biāo)簽可以有0個(gè)或多個(gè)屬性,如果沒有屬性存在的時(shí)候,我們使用attrs獲得的字典是一個(gè)空字典,但是無論有無屬性,我們總能獲得一個(gè)字典

下面看tag標(biāo)簽的string元素,這個(gè)元素是一個(gè)字符串類型,它表示的是尖括號標(biāo)簽之間的那部分字符串
假設(shè)我們有一鍋湯叫soup
soup.a 這是標(biāo)簽的信息,
a標(biāo)簽的string我們用soup.a.string來實(shí)現(xiàn),我們可以看到這個(gè)tag標(biāo)簽中表達(dá)的信息是‘basic python’
通過p標(biāo)簽的字符串信息
再看一下NavigableString也是一個(gè)bs4庫定義的類型
還有一個(gè)注意點(diǎn),針對<p>標(biāo)簽的實(shí)例,我們可以看到<p>標(biāo)簽中實(shí)際還包含了一個(gè)<b>標(biāo)簽,但是當(dāng)我們輸出soup.p.string的時(shí)候,我們打印的string并不包含<b>標(biāo)簽,這說明NavigableString是可以跨越多個(gè)標(biāo)簽層次的

下面我們看一下tag的另一種類型叫comment類型,comment是注釋的意思,表示的是如果是html頁面中出現(xiàn)有注釋的部分該怎么處理
我們重做一鍋湯,我們看到在 <b> 標(biāo)簽中有一個(gè)注釋
在html的表達(dá)中,我們用 <! 來表示一個(gè)注釋的開始,那么 <p> 標(biāo)簽中呢給出的信息就不是一個(gè)注釋
接下來看一下b標(biāo)簽的string,b標(biāo)簽打印出了注釋內(nèi)容
我們看下它的類型,他是一個(gè)bs4.element.comment類型
我們再來看一下p標(biāo)簽的類型, ?我們發(fā)現(xiàn)p標(biāo)簽是一個(gè)字符串,同時(shí)它的類型是 NavigableString 類型
我們對p標(biāo)簽和b標(biāo)簽分別使用 .string 的時(shí)候,我們都能產(chǎn)生一段文本,但是當(dāng)這個(gè)文本是注釋形式的時(shí)候,它并沒有標(biāo)明它是注釋,也就是說它的 <! 被去掉了,所以在有的時(shí)候分析文檔的時(shí)候,我們需要對其中的注釋部分做相關(guān)的判斷,而判斷的依據(jù)就是它的類型,這種情況在我們分析文本中并不常用,所以稍做了解就行


具體使用方法:
我們可以用 .tag 方式獲得標(biāo)簽信息,比如說我們soup.a獲得a標(biāo)簽 ? ??soup.p獲得p標(biāo)簽
.name的方式獲得標(biāo)簽的名字,比如說p.name
.attrs獲得標(biāo)簽的屬性
這里面,無論是否一個(gè)標(biāo)簽存在屬性,它都會返回一個(gè)字典類型
對于標(biāo)簽之間的字符串,我們可以用 .string 的方式獲取
獲取過程中,如果其中存在注釋,那么它會返回一種特殊的注釋類型
如果我們不希望提取注釋信息,需要對這種類型做相關(guān)的判斷