您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“BeautifulSoup常用語法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“BeautifulSoup常用語法有哪些”吧!
BeautifulSoup默認支持Python的標準HTML解析庫,但是它也支持一些第三方的解析庫
解析庫 | 使用方法 | 優(yōu)勢 | 劣勢 |
---|---|---|---|
Python標準庫 | BeautifulSoup(html,’html.parser’) | Python內(nèi)置標準庫;執(zhí)行速度快 | 容錯能力較差 |
lxml HTML解析庫 | BeautifulSoup(html,’lxml’) | 速度快;容錯能力強 | 需要安裝,需要C語言庫 |
lxml XML解析庫 | BeautifulSoup(html,[‘lxml’,’xml’]) | 速度快;容錯能力強;支持XML格式 | 需要C語言庫 |
htm5lib解析庫 | BeautifulSoup(html,’htm5llib’) | 以瀏覽器方式解析,最好的容錯性 | 速度慢 |
demo html
<!DOCTYPE html> <!--STATUS OK--> <html> <head> <meta content="text/html;charset=utf-8" http-equiv="content-type"/> <meta content="IE=Edge" http-equiv="X-UA-Compatible"/> <meta content="always" name="referrer"/> <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/> <title>百度一下,你就知道 </title> </head> <body link="#0000cc"> <div id="wrapper"> <div id="head"> <div class="head_wrapper"> <div id="u1"> <a rel="nofollow" class="mnav" href="http://news.baidu.com" name="tj_trnews"> 新聞 </a> <a rel="nofollow" class="mnav" href="https://www.hao123.com" name="tj_trhao123"> hao123 </a> <a rel="nofollow" class="mnav" href="http://map.baidu.com" name="tj_trmap"> 地圖 </a> <a rel="nofollow" class="mnav" href="http://v.baidu.com" name="tj_trvideo"> 視頻 </a> <a rel="nofollow" class="mnav" href="http://tieba.baidu.com" name="tj_trtieba"> 貼吧 </a> <a rel="nofollow" class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;"> 更多產(chǎn)品 </a> </div> </div> </div> </div> </body> </html>
from bs4 import BeautifulSoup soup = BeautifulSoup(html,"html.parser") # 縮進格式 print(soup.prettify()) # 獲取title標簽的所有內(nèi)容 print(soup.title) #Output:<title>百度一下,你就知道 </title> # 獲取title標簽的名稱 print(soup.title.name) #Output:title # 獲取title標簽的文本內(nèi)容 print(soup.title.string) #Output:百度一下,你就知道 # 獲取head標簽的所有內(nèi)容 print(soup.head) # 獲取第一個div標簽中的所有內(nèi)容 print(soup.div) # 獲取第一個div標簽的id的值 print(soup.div["id"]) # 獲取第一個a標簽中的所有內(nèi)容 print(soup.a) # 獲取所有的a標簽中的所有內(nèi)容 print(soup.find_all("a")) # 獲取id="u1" print(soup.find(id="u1")) # 獲取所有的a標簽,并遍歷打印a標簽中的href的值 for item in soup.find_all("a"): print(item.get("href")) # 獲取所有的a標簽,并遍歷打印a標簽的文本值 for item in soup.find_all("a"): print(item.get_text())
BeautifulSoup4將復(fù)雜HTML文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu),每個節(jié)點都是Python對象,所有對象可以歸納為4種:
Tag:通俗點講就是HTML中的一個個標簽
from soup4 import BeautifulSoup soup = BeautifulSoup(html,"html.parser") # 獲取title標簽的所有內(nèi)容 print(soup.title) # 獲取head標簽的所有內(nèi)容 print(soup.head) # 獲取第一個a標簽的所有內(nèi)容 print(soup.a) # 類型 print(type(soup.a #soup 對象本身比較特殊,它的 name 即為 [document] print(soup.name) # head #對于其他內(nèi)部標簽,輸出的值便為標簽本身的名稱 print(soup.head.name) # 在這里,我們把 a 標簽的所有屬性打印輸出了出來,得到的類型是一個字典。 print(soup.a.attrs) #還可以利用get方法,傳入屬性的名稱,二者是等價的 print(soup.a['class']) # soup.a.get('class') # 可以對這些屬性和內(nèi)容等等進行修改 soup.a['class'] = "newClass" print(soup.a) # 還可以對這個屬性進行刪除 del soup.a['class'] print(soup.a)
NavigableString: 獲取標簽內(nèi)部的文字用 .string 即可
print(soup.title.string) print(type(soup.title.string))
BeautifulSoup: 表示的是一個文檔的內(nèi)容
print(type(soup.name)) print(soup.name) print(soup.attrs)
Comment: 是一個特殊類型的 NavigableString 對象,其輸出的內(nèi)容不包括注釋符號。
print(soup.a) # 此時不能出現(xiàn)空格和換行符,a標簽如下: # <a rel="nofollow" class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新聞--></a> print(soup.a.string) # 新聞 print(type(soup.a.string)) # <class 'soup4.element.Comment'>
.contents:獲取Tag的所有子節(jié)點,返回一個list
# tag的.content 屬性可以將tag的子節(jié)點以列表的方式輸出 print(soup.head.contents) # 用列表索引來獲取它的某一個元素 print(soup.head.contents[1])
.children:獲取Tag的所有子節(jié)點,返回一個生成器
for child in soup.body.children: print(child)
find_all(name, attrs, recursive, text, **kwargs)
并不是所有的屬性都可以使用上面這種方式進行搜索,比如HTML的data-*屬性,我們可以使用attrs參數(shù),定義一個字典來搜索包含特殊屬性的tag:
item_list = soup.find_all(attrs={"data-foo":"value"}) for item in item_list: print(item)
通過text參數(shù)可以搜索文檔中的字符串內(nèi)容,與name參數(shù)的可選值一樣。text參數(shù)接受 字符串,正則表達式,列表
item_list = soup.find_all(attrs={"data-foo": "value"}) for item in item_list: print(item) item_list = soup.find_all(text="hao123") for item in item_list: print(item) item_list = soup.find_all(text=["hao123", "地圖", "貼吧"]) for item in item_list: print(item) item_list = soup.find_all(text=re.compile("\d")) for item in item_list: print(item)
傳入一個limit參數(shù)來限制返回的數(shù)量
item_list = soup.find_all("a",limit=2) for item in item_list: print(item)
limit參數(shù)
text參數(shù)
字符串過濾:會查找與字符串完全匹配的內(nèi)容
正則表達式過:如果傳入的是正則表達式,那么BeautifulSoup4會通過search()來匹配內(nèi)容
列表: 如果傳入一個列表,BeautifulSoup4將會與列表中的任一元素匹配到的節(jié)點返回
方法: 傳入一個方法,根據(jù)方法來匹配
name參數(shù)
a_list = soup.find_all("a") print(a_list)
item_list = soup.find_all(re.compile("a")) for item in item_list: print(item)
item_list = soup.find_all(["meta","link"]) for item in item_list: print(item)
def name_is_exists(tag): return tag.has_attr("name") item_list = soup.find_all(name_is_exists) for item in item_list: print(item)
kwargs參數(shù)
# 查詢id=head的Tag item_list = soup.find_all(id="head") print(item_list) # 查詢href屬性包含ss1.bdstatic.com的Tag item_list = soup.find_all(href=re.compile("http://news.baidu.com")) print(item_list) # 查詢所有包含class的Tag(注意:class在Python中屬于關(guān)鍵字,所以加_以示區(qū)別) item_list = soup.find_all(class_=True) for item in item_list: print(item)
attrs參數(shù)
find
返回符合條件的第一個Tag,即當我們要取一個值的時候就可以用這個方法
t = soup.div.div # 等價于 t = soup.find("div").find("div")
通過標簽名查找
print(soup.select('title')) print(soup.select('a'))
通過類名查找
print(soup.select('.mnav'))
通過id查找
print(soup.select('#u1'))
組合查找
print(soup.select('div .bri'))
屬性查找
print(soup.select('a[class="bri"]')) print(soup.select('a[href="http://tieba.baidu.com"]'))
獲取內(nèi)容
item_list = soup.select("title") print(soup.select('title')[0].get_text())
到此,相信大家對“BeautifulSoup常用語法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。