BeautifulSoup的提供了兩個超級好用的方法(可能是你用bs方法中最常用的)。借助這兩個函數,你可以通過表現的不同屬性輕松過濾HTML(XML)文件,查找需要的標簽組或單個標簽。
首先find(),findAll()是當有了bs對象之后,獲取標簽組或者單個標簽的函數。find()找到第一個滿足條件的標簽就返回,findAll()找到所有滿足條件的標簽返回。
看一下兩個函數的參數,findAll多了一個limit參數。 #參數不是每次用的時候需要把所有參數都要寫出來
findAll(tag,atributes,recursive,text,limit,keywords)
find(tag,atributes,recursive,text,keywords)
實例中多用findAll()函數,因為find()函數只返回一個,沒有代表性。
①參數tag,可以使用參數tag表明需要查找的標簽類型,tag可以是多個:
.findAll({'h1'}) #返回h1標簽列表 .findAll({'h1','h2','h3'}) #返回h1-h3標題標簽列表 .findAll({'h1','h2','h3','h4','h5','h6','h7'}) #返回所有標題標簽的列表
②參數attribute,使用標簽內的若干屬性對應的屬性值進行標簽查找,屬性值可以是多個
.findAll('span',{'class':{'green','red'}}) #返回class屬性為red和green的span標簽列表
③參數recursive,是否使用遞歸方法遍歷每一個子標簽,默認是開啟,True。如果設置為False,findAll()只查找文檔的一級標簽。一般使用中,不用去動這個參數
④參數text,根據標簽的文本內容去查找標簽列表,通常配合正則表達式使用
nameList = bsObj.findAll(text='the prince') #匹配所有標簽文本內容為‘the prince’的標簽列表
nameList = bsObj.findAll(text=re.compile('the*')) #匹配所有標簽文本內容為‘the’開頭的標簽列表,使用了正則表達式re,正則表達式在此文中不做講解
⑤參數limit,范圍限制參數,顯然只能用於findAll()函數。就是限定返回的個數,比如要抽取多少個標簽信息做樣本之類的
⑥參數keyword,標簽內指定屬性的標簽列表#與attribute參數相似,有一個例外就是用class屬性查找標簽的時候,直接findAll(class=‘green’)會報錯,因為class是保留字
bsObj.findAll(id='text')
bsObj.findAll(class='text') #會報錯
bsObj.findAll(class_='text')解決方案