成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python爬蟲筆記4-BeautifulSoup使用

fobnn / 1371人閱讀

摘要:方法作用查找所有符合條件的元素,返回的是列表形式參數(shù)可以根據(jù)節(jié)點(diǎn)名來查找元素。示例查詢第一個(gè)標(biāo)簽查找第一個(gè)節(jié)點(diǎn)內(nèi)容中有字符串的節(jié)點(diǎn)內(nèi)容運(yùn)行結(jié)果關(guān)于的使用就這樣吧,常用個(gè)人就覺得用好即可參考鏈接崔慶才網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)使用

BeautifulSoup介紹

lxml一樣,BeautifulSoup也是一個(gè)HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML數(shù)據(jù)。

幾種解析工具的對比

工具 速度 難度
正則表達(dá)式 最快 困難
BeautifulSoup 最簡單
lxml 簡單
lxml 只會局部遍歷,而Beautiful Soup 是基于HTML DOM的,會載入整個(gè)文檔,解析整個(gè)DOM樹,因此時(shí)間和內(nèi)存開銷都會大很多,所以性能要低于lxml。

安裝
我的環(huán)境是Python 3.6.5,windows下cmd里執(zhí)行pip安裝即可。

pip3 install beautifulsoup4

測試
python終端里導(dǎo)入beautifulsoup,無報(bào)錯(cuò)信息即安裝成功。

>>from bs4 import BeautifulSoup
>>
BeautifulSoup對象

BeautifulSoup將復(fù)雜的HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對象,所有對象可以歸納為4種:

Tag

NavigableString

BeautifulSoup

Comment

BeautifulSoup 對象表示的是一個(gè)文檔的內(nèi)容。大部分時(shí)候,可以把它當(dāng)作 Tag 對象,是一個(gè)特殊的 Tag。
Comment 對象是一個(gè)特殊類型的 NavigableString 對象,其輸出的內(nèi)容不包括注釋符號。

Tag

Tag可以簡單理解為HTML文檔中的一個(gè)個(gè)的標(biāo)簽,比如:

The Dormouse"s story
  • first item
  • 上面HTML文檔中的head、title、ur、li都是HTML標(biāo)簽(節(jié)點(diǎn)名稱),這些標(biāo)簽加上里面的內(nèi)容就是tag。

    獲取Tags

    # 導(dǎo)入模塊
    from bs4 import BeautifulSoup
    
    html = """
    The Dormouse"s story
    
    

    The Dormouse"s story

    Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

    ...

    """ # 初始化BeautifulSoup對象,指定lxml解析器 soup = BeautifulSoup(html, "lxml") # prettify()方法格式化soup的內(nèi)容 print(soup.prettify()) # soup.title選出title節(jié)點(diǎn) print(soup.title) # The Dormouse"s story print(type(soup.title)) # print(soup.head) # The Dormouse"s story print(soup.p) #

    The Dormouse"s story

    說明:使用soup加節(jié)點(diǎn)名稱可以獲取節(jié)點(diǎn)內(nèi)容,這些對象的類型是bs4.element.Tag,但是它查找的是在內(nèi)容中第一個(gè)符合要求的節(jié)點(diǎn)。比如上面代碼有多個(gè)p標(biāo)簽,但是它只查找了第一個(gè)p標(biāo)簽。

    對于Tag有兩個(gè)重要的屬性,nameattrs。當(dāng)選擇一個(gè)節(jié)點(diǎn)后,name屬性獲取節(jié)點(diǎn)的名稱,attrs屬性獲取節(jié)點(diǎn)的屬性(以字典形式返回)。

    print(soup.name)
    # [document] #soup 對象本身比較特殊,它的 name 即為 [document]
    print(soup.head.name)
    # head #對于其他內(nèi)部標(biāo)簽,輸出的值便為標(biāo)簽本身的名稱
        
    print(soup.p.attrs)
    # {"class": ["title"], "name": "dromouse"}
    # 在這里,我們把 p 標(biāo)簽的所有屬性打印輸出了出來,得到的類型是一個(gè)字典。
    
    # 下面三種方法都可以獲取字典里的值,是等價(jià)的,結(jié)果都一樣
    print(soup.p.get("class"))
    # ["title"]
    print(soup.p["class"])
    # ["title"]
    print(soup.p.attrs["class"])
    # ["title"]
    
    # 還可以針對屬性或者內(nèi)容進(jìn)行修改
    soup.p["class"] = "newClass"
    print (soup.p)
    # 

    The Dormouse"s story

    NavigableString

    獲取了Tag,也就是獲取了節(jié)點(diǎn)內(nèi)容,但是只想要獲取節(jié)點(diǎn)內(nèi)部的內(nèi)容怎么辦?只需使用.string即可。

    # 獲取節(jié)點(diǎn)內(nèi)容
    print(soup.p.string)
    # The Dormouse"s story
    
    print(type(soup.p.string))
    # 
    遍歷文檔樹

    在選取節(jié)點(diǎn)的時(shí)候,也可以先選取一個(gè)節(jié)點(diǎn),然后以這個(gè)節(jié)點(diǎn)為基準(zhǔn)選取它的子節(jié)點(diǎn),父節(jié)點(diǎn),子孫節(jié)點(diǎn)等等,下面就介紹常用的選取方法。

    獲取直接子節(jié)點(diǎn).contents .children屬性

    .contents

    tag的.contents屬性可以將tag的直接子節(jié)點(diǎn)以列表的方式輸出。
    下面例子選取head節(jié)點(diǎn)為基準(zhǔn),.contents選取head的子節(jié)點(diǎn)title,然后以列表返回。

    print(soup.head.contents)
    # [The Dormouse"s story]

    輸出方式為列表,可以用列表索引來獲取它的某一個(gè)元素.

    print(soup.head.contents[0])
    # The Dormouse"s story
    

    .children

    children屬性和contents屬性不同的是它返回的不是一個(gè)列表,而是一個(gè)生成器。可用for循環(huán)輸出結(jié)果。

    print(soup.head.children)
    # 
    
    for i in soup.head.children:
        print(i)
    # The Dormouse"s story    
    
    獲取所有子孫節(jié)點(diǎn):.descendants屬性

    上面兩個(gè)屬性都只能獲取到基準(zhǔn)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),要想獲取節(jié)點(diǎn)的所有子孫節(jié)點(diǎn),就可以使用descendants屬性了。它返回的也是一個(gè)生成器。

    print(soup.descendants)
    # 
    

    還有其他屬性如查找父節(jié)點(diǎn),組父節(jié)點(diǎn)的屬性就不記錄了(平時(shí)很少用)。

    搜索文檔樹

    BeautifulSoup提供了一些查詢方法(find_all,find等),調(diào)用對應(yīng)方法,輸入查詢參數(shù)就可以得到我們想要的內(nèi)容了,可以理解為搜索引擎的功能。(百度/谷歌=查詢方法,查詢內(nèi)容=查詢參數(shù),返回的網(wǎng)頁=想要的內(nèi)容)
    下面介紹最常用的find_all方法。

    find_all方法

    作用:查找所有符合條件的元素,返回的是列表形式
    API:find_all(name, attrs, recursive, text, **kwargs)
    1. name
    name 參數(shù)可以根據(jù)節(jié)點(diǎn)名來查找元素。
    A. 傳字符串
    最簡單的過濾器是字符串.在搜索方法中傳入一個(gè)字符串參數(shù),BeautifulSoup會查找與字符串完整匹配的內(nèi)容,下面的例子用于查找文檔中所有的

    標(biāo)簽。

    print(soup.find_all("p"))
    # 通常以下面方式寫比較好
    print(soup.find_all(name="p"))
    

    B.傳正則表達(dá)式
    如果傳入正則表達(dá)式作為參數(shù),Beautiful Soup會通過正則表達(dá)式的 match() 來匹配內(nèi)容.下面例子中找出所有以p開頭的標(biāo)簽。

    import re
    print(soup.find_all(re.compile("^p")))
    

    C.傳列表
    如果傳入列表參數(shù),BeautifulSoup會將與列表中任一元素匹配的內(nèi)容返回。下面代碼會找到HTML代碼中的head標(biāo)簽和b標(biāo)簽。

    print(soup.find_all(["head","b"]))
    # [The Dormouse"s story, The Dormouse"s story]
    

    2. attrs
    find_all中attrs參數(shù)可以根據(jù)節(jié)點(diǎn)屬性查詢。
    查詢時(shí)傳入的參數(shù)是字典類型。比如查詢id=link1的節(jié)點(diǎn)

    print(soup.find_all(attrs={"id":"link1"}))
    # []

    對于常見的屬性,可以不用以attrs來傳遞,直接傳入查詢參數(shù)即可。比如id,class_(class為Python關(guān)鍵字,使用下劃線區(qū)分),如下:

    print(soup.find_all(id="link1"))
    print(soup.find_all(class_="sister"))

    運(yùn)行結(jié)果:

    []
    
    [, Lacie, Tillie]
    

    3. text
    text 參數(shù)可以搜搜文檔中的字符串內(nèi)容,與 name 參數(shù)的可選值一樣, text 參數(shù)接受 字符串 , 正則表達(dá)式 , 列表。下面代碼查找節(jié)點(diǎn)里內(nèi)容中有story字符串的節(jié)點(diǎn),并返回節(jié)點(diǎn)的內(nèi)容。

    print(soup.find_all(text=re.compile("story")))
    # ["The Dormouse"s story", "The Dormouse"s story"]
    
    
    find方法

    find方法與find_all方法的區(qū)別:
    find_all:查詢符合所有條件的元素,返回列表。
    find:只查找第一個(gè)匹配到的元素,返回單個(gè)元素,類型tag。
    查詢方法與find_all大同小異。示例:

    print(soup.find(name="p")) # 查詢第一個(gè)p標(biāo)簽
    print(soup.find(text=re.compile("story"))) # 查找第一個(gè)節(jié)點(diǎn)內(nèi)容中有story字符串的節(jié)點(diǎn)內(nèi)容

    運(yùn)行結(jié)果:

    The Dormouse"s story

    The Dormouse"s story
    關(guān)于BeautifulSoup的使用就這樣吧,常用個(gè)人就覺得用好find_all即可(=.=~)
    參考鏈接

    崔慶才 [Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)]:4.2-使用Beautiful Soup

    文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43388.html

    相關(guān)文章

    • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

      摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

      Harriet666 評論0 收藏0
    • SegmentFault 技術(shù)周刊 Vol.30 - 學(xué)習(xí) Python 來做一些神奇好玩的事情吧

      摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個(gè)提問: pyth...

      lifesimple 評論0 收藏0
    • Python爬蟲筆記1-爬蟲背景了解

      摘要:學(xué)習(xí)爬蟲的背景了解。但是搜索引擎蜘蛛的爬行是被輸入了一定的規(guī)則的,它需要遵從一些命令或文件的內(nèi)容,如標(biāo)注為的鏈接,或者是協(xié)議。不同領(lǐng)域不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無法提供針對具體某個(gè)用戶的搜索結(jié)果。 學(xué)習(xí)python爬蟲的背景了解。 大數(shù)據(jù)時(shí)代數(shù)據(jù)獲取方式 如今,人類社會已經(jīng)進(jìn)入了大數(shù)據(jù)時(shí)代,數(shù)據(jù)已經(jīng)成為必不可少的部分,可見數(shù)據(jù)的獲取非常重要,而數(shù)據(jù)的獲取的方式...

      oujie 評論0 收藏0
    • 學(xué)習(xí)筆記 | HTML 基本結(jié)構(gòu)和基本標(biāo)簽 ——前端學(xué)習(xí)第一步!

      摘要:基本結(jié)構(gòu)語言中,一個(gè)頁面是由四個(gè)部分組成文檔聲明標(biāo)簽對標(biāo)簽對標(biāo)簽對圖示文檔聲明這是一個(gè)文檔聲明,表示這是一個(gè)頁面。標(biāo)簽標(biāo)簽表示頁面內(nèi)容的范圍。 HTML HTML ...

      sPeng 評論0 收藏0

    發(fā)表評論

    0條評論

    最新活動
    閱讀需要支付1元查看
    <