上集回顧:
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了禹會免費建站歡迎大家使用!
上集快速領(lǐng)略了一下 BeautifulSoup 的大概功能,并學(xué)習(xí)了如何安裝和構(gòu)造一個 BeautifulSoup 對象。
本集學(xué)習(xí) BeautifulSoup 的 Tag 及其屬性。
由于HTML和XML是由大量tag組合和嵌套而成,所以檢索目標(biāo)信息就是檢索目標(biāo)tag的過程。
一、Tag對象
Tag 對象與XML或HTML原生文檔中的tag相同:
Tag有很多方法和屬性,其中最重要的屬性是: name和attributes。
二、name屬性
每個tag都有自己的名字,通過 .name 來獲取:
如果改變了tag的name,那將影響所有通過當(dāng)前Beautiful Soup對象生成的HTML文檔:
三、attributes屬性
一個tag可能有很多個屬性. tag b class="boldest" 有一個 “class” 的屬性,值為 “boldest” . tag的屬性的操作方法與字典相同:
也可以直接”點”取屬性, 比如: .attrs :
tag的屬性可以被添加,刪除或修改. 再說一次, tag的屬性操作方法與字典一樣
四、多值屬性
HTML 定義了一系列可以包含多個值的屬性。最常見的多值的屬性是 class (一個tag可以有多個CSS的class). 還有一些屬性 rel , rev , accept-charset , headers , accesskey 。在Beautiful Soup中多值屬性的返回類型是list:
如果某個屬性看起來好像有多個值,但在任何版本的HTML定義中都沒有被定義為多值屬性,那么Beautiful Soup會將這個屬性作為字符串返回
將tag轉(zhuǎn)換成字符串時,多值屬性會合并為一個值
如果轉(zhuǎn)換的文檔是XML格式,那么tag中不包含多值屬性
五、字符串
字符串常被包含在tag內(nèi)。BeautifulSoup用 NavigableString 類來包裝tag中的字符串:
一個 NavigableString 字符串與Python中的Unicode字符串相同,通過 unicode() 方法可以直接將 NavigableString 對象轉(zhuǎn)換成Unicode字符串:
本集總結(jié):
下集見
如果有一個字符串s(我用的是python3)
那么第一個字符是s[0],最后一個字符是s[len(s)-1]
然后判斷這兩個字符是不是尖括號就可以了
這個不難啊,用id來定位元素,然后就可以了。id通常是唯一的。
from?bs4?import?BeautifulSoup
html_doc?=?'a?href=""?class="sister"?id="link1"Elsie/a,'
soup?=?BeautifulSoup(html_doc,?'html.parser')
print?soup.find(id="link1").string???#?=?'Elsie'
如果要用sgmllib解析html,則要繼承sgmllib.SGMLParser類,此類里的函數(shù)都是空的,用戶需要重載它。這個類提供的功能是在特定情況下調(diào)用相應(yīng)的函數(shù)。
比如當(dāng)發(fā)現(xiàn)html標(biāo)簽時,如果并沒有定義 start_html(self,attr)函數(shù),則會調(diào)用unknown_starttag函數(shù),具體怎么處理則根據(jù)用戶。
sgml的標(biāo)簽是可以自定義的,比如自己定義了一個start_lala函數(shù),則就會處理lala標(biāo)簽。
有個地方要說明下,如果定義了start_tagname函數(shù),有定義了handle_starttag函數(shù),則函數(shù)只會運(yùn)行handle_starttag函數(shù),start_tagname為空函數(shù)都沒有問題,如果沒有定義handle_starttag函數(shù),則遇到tagname標(biāo)簽時,會運(yùn)行start_tagname函數(shù)。如果沒有定義tagname的start函數(shù),則此標(biāo)簽為未知標(biāo)簽,調(diào)用unknown_starttag函數(shù)
給你個例子你就知道了:
#------------------?HTMLParser_stack.py?------------------#
#--?coding:?GBK?--
import?sgmllib,sys,os,string
html?=?"""lalaheadtitleAdvice/title/headbody
pThe?a?href=""?mce_href=""IETF?admonishes:
iBe?strict?in?what?you?bsend/b./i/a/p
form
input?type=submit?name='我'?我?input?type=text?name=start?size=4/form
/body/lala
"""
os.chdir('d://python')
f=file('testboard.txt','r')
contest=f.read()
tagstack?=?[]
class?ShowStructure(sgmllib.SGMLParser):
def?handle_starttag(self,?tag,?method,attrs):?tagstack.append(tag)
def?handle_endtag(self,?tag):?tagstack.pop()
def?handle_data(self,?data):
if?data.strip():
for?tag?in?tagstack:?sys.stdout.write('/'+tag)
sys.stdout.write('??%s/n'?%?data[:40].strip())
def?unknown_starttag(self,tag,attrs):
print?'start?tag:'+tag+''
def?unknown_endtag(self,tag):
print?'end?tag:/'+tag+''
def?start_lala(self,attr):
print?'lala?tag?found'
ShowStructure().feed(html)
輸出:
start tag:head
start tag:title
/lala Advice
end tag:/title
end tag:/head
start tag:body
start tag:p
/lala The
start tag:a
/lala IETF admonishes:
start tag:i
/lala Be strict in what you
start tag:b
/lala send
end tag:/b
/lala .
end tag:/i
end tag:/a
end tag:/p
start tag:form
start tag:input
/lala ?
start tag:input
end tag:/form
end tag:/body
end tag:/lala
報錯提示給你說的很明顯了......
可能是“text1”在你代碼中間被替換了,
變成了None,
檢查代碼吧。。。