亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Python每日一庫之Beautiful Soup

                Beautiful Soup4是一個 Python 庫,用于從 HTML 和 XML 文件中提取數(shù)據(jù)。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),Beautiful Soup自動將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。

                BeautifulSoup安裝

                使用pip來安裝BeautifulSoup

                pip install bs4

                另外要安裝解析器,下列表格列出一些常用的解析器。

                解析器

                使用方法

                優(yōu)點

                缺點

                Python內(nèi)置解析器html

                BeautifulSoup(doc,”html.parser”)

                Python內(nèi)置的標準庫,執(zhí)行速度中等,文檔容錯能力強

                中文文檔容錯能力差

                lxml HTML解析器

                BeautifulSoup(doc,”lxml”)

                執(zhí)行速度快,文檔容錯能力強

                需要依賴C語言的庫

                lxml XML解析器

                BeautifulSoup(doc,”xml”)

                執(zhí)行速度快,唯一支持XML的解析器

                需要依賴C語言的庫

                html5lib

                BeautifulSoup(doc,”html5lib”)

                以瀏覽器的方式解析文檔可以生成HTML5格式的文檔

                速度慢

                使用BeautifulSoup及四大對象

                創(chuàng)建BeautifulSoup對象

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.prettify())// 格式化輸出print(soup.get_text()) // 獲取網(wǎng)頁所有的文字內(nèi)容

                BeautifulSoup四大對象

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

                • Tag:HTML中的標簽,簡單來說就是html標簽。
                • NavigableString:簡單來說就是標簽里面的內(nèi)容,它的類型是一個NavigableString,翻譯過來叫可以遍歷的字符串。
                • BeautifulSoup:BeautifulSoup對象表示的是一個文檔的全部內(nèi)容,大部分時候,可以把它當作Tag對象,是一個特殊的Tag,我們可以分別獲取它的類型、名稱、以及屬性
                • Comment:一個特殊類型的NavigableString對象,其實輸出的內(nèi)容不包括注釋符號

                Tag對象示例

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.title)print(soup.a)print(soup.p)

                運行輸出如下圖所示,但是發(fā)現(xiàn)好像這個網(wǎng)頁不止一個a標簽跟p標簽,是因為它查找的是在所有內(nèi)容中的第一個符合要求的標簽,要是想得到所有符合要求的標簽,后面會介紹find_all函數(shù)。

                在Tag對象中有兩個重要的屬性,name和attrs。

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.a.attrs)

                運行輸出如下圖所示,name輸出的是標簽的本身,attrs輸出的是一個字典的類型,如果我們需要得到某個標簽的某個屬性可以使用字典一些方法去獲取比如get方法,print(soup.p.get(“class”))或者直接使用print(soup.p[“class”])

                NavigableString代碼示例

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.a.string)

                運行輸出如下圖,可以NavigableString類型的string方法輕松獲取到了標簽里面的內(nèi)容。

                BeautifulSoup代碼示例

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.name)print(soup.attrs)

                運行輸出如下圖所示

                Comment代碼示例

                from bs4 import BeautifulSouphtmlText = ‘#’soup = BeautifulSoup(htmlText)print(soup.a.string)

                運行輸出如下,a 標簽里的內(nèi)容實際上是注釋,但是如果利用 .string方法來輸出它的內(nèi)容,發(fā)現(xiàn)它已經(jīng)把注釋符號去掉了,所以這可能會給帶來不必要的麻煩。

                文檔樹遍歷

                • 直接子節(jié)點

                tag里面的content屬性可以將tag的子節(jié)點以列表的形式返回。通過遍歷content.返回的列表來獲取每一個子節(jié)點或者直接使用tag的children方法來獲取。

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.head.contents)for child in soup.head.contents:print(child)for child in soup.head.children:print(child)

                運行輸出結(jié)果如下圖所示

                • 所有子孫節(jié)點

                tag里面的.descendants 屬性可以對所有tag的子孫節(jié)點進行遞歸循環(huán),和 children類似,我們也需要遍歷獲取其中的內(nèi)容。

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)for child in soup.descendants: print(child)

                運行結(jié)果輸出如下圖所示

                • 節(jié)點內(nèi)容

                使用.string方法來獲取內(nèi)容,如果一個標簽里面沒有標簽了,那么 .string 就會返回標簽里面的內(nèi)容。如果標簽里面只有唯一的一個標簽了,那么 .string 也會返回最里面的內(nèi)容,如果標簽里面沒有內(nèi)容則返回None

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)print(soup.a.string)print(soup.title.string)

                運行結(jié)果輸出如下圖所示

                • 多個內(nèi)容

                使用strippend_strings 屬性來獲取多個內(nèi)容還可以出除多余的空白字符,需要使用遍歷來獲取,

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content)for child in soup.stripped_strings:print(child)

                運行結(jié)果輸出如下圖所示

                • 父節(jié)點

                通過元素的 .parents 屬性可以遞歸得到元素的所有父輩節(jié)點

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”html.parser”)parentObject = soup.head.titlefor parent in parentObject.parent:print(parent.name)

                運行結(jié)果輸出如下圖所示

                還有一些節(jié)點就不舉例,跟其它獲取節(jié)點一樣也是需要遍歷,而且使用的場景不同,兄弟節(jié)點使用.next_siblings或者.previous_sibling方法,前后節(jié)點使用.next_element或者.previous_element方法。

                搜索文檔樹

                find_all(name,attrs,recursive,text,**kwargs),find_all()方法用于搜索當前tag的所有tag子節(jié)點,并判斷是否符合過濾條件。

                name 參數(shù)

                name參數(shù)可以查找所有名字為name的tag,字符串對象會被自動忽略掉

                • 傳字符串

                最簡單的過濾器是字符串,在搜索方法中傳入一個字符串參數(shù),beautifulsoup會查找與字符串完整匹配的內(nèi)容,下面的例子用于查找文檔中的所有a標簽

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.find_all(“a”))

                • 傳正則表達式

                如果傳入正則表達式作為參數(shù),beautiful soup會通過正則表達式的match()來匹配內(nèi)容,下面例子中找出所有以b開頭的標簽,這表示b開頭標簽都應該被找到,如果都正則表達式不熟悉的可以看我之前寫關于正則表示式的文章:https://www.toutiao.com/article/7140941215431819783/?log_from=4bb8705803d45_1663051238064

                from bs4 import BeautifulSoupimport requestsimport reurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)for tag in soup.find_all(re.compile(‘^b’)):print(tag.name)

                運行結(jié)果如下圖所示

                • 傳列表

                如果傳入列表參數(shù),Beautiful Soup會將與列表中任一元素匹配的內(nèi)容返回.下面代碼找到文檔中所有標簽和標簽

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.find_all([“a”, “p”]))

                運行結(jié)果如下圖所示

                • 傳True

                true 可以匹配任何值,下面代碼查找到所有的tag,但是不會返回字符串節(jié)點

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)for tag in soup.find_all(True):print(tag.name)

                運行結(jié)果如下圖所示

                • 傳函數(shù)

                如果沒有合適過濾器,那么還可以定義一個函數(shù),函數(shù)只接受一個元素參數(shù) [4] ,如果這個方法返回 True 表示當前元素匹配并且被找到,如果不是則返回 False

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)def has_class_but_no_id(tag):return tag.has_attr(‘class’) and not tag.has_attr(‘id’)print(soup.find_all(has_class_but_no_id))

                輸出結(jié)果如下圖所示

                • keyword 參數(shù)

                注意:如果一個指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時會把該參數(shù)當作指定名字tag的屬性來搜索,如果包含一個名字為id的參數(shù),Beautifulsoup會搜索每個tag的’id’值

                import refrom bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.find_all(id=’lg’))print(soup.find_all(href=re.compile(“hao123”)))

                運行結(jié)果如下圖所示

              1. find(name , attrs , recursive , text , **kwargs ), 它與 find_all() 方法唯一的區(qū)別是 find_all() 方法的返回結(jié)果是值包含一個元素的列表,而 find() 方法直接返回結(jié)果。
              2. CSS選擇器

                在使用BeautifulSoup中常用的有5中css選擇器方法,用到的方法是 soup.select(),返回類型是列表

                • 通過標簽名查找

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(“title”))

                運行結(jié)果如下圖所示

                • 通過CSS類名查找

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(“.mnav”))

                運行結(jié)果如下圖所示

                • 通過ID來查找

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(“#lg”))

                運行結(jié)果如下圖所示

                • 組合查找

                組合查找有點類似前端CSS選擇器中的組合選擇器,組合查找還可以使用子代選擇器。

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(‘p #lg’))print(soup.select(‘p > a’))

                運行結(jié)果如下圖所示

                • 通過CSS屬性查找

                使用屬性需要用中括號括起來,注意屬性和標簽屬于同一節(jié)點,所以中間不能加空格,否則會無法匹配到。

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(‘a[class=”mnav”]’))

                不同節(jié)點使用屬性查找

                from bs4 import BeautifulSoupimport requestsurl = “https://www.baidu.com”content = requests.get(url).contentsoup = BeautifulSoup(content,”lxml”)print(soup.select(‘span input[class=”bg s_btn”]’))

                運行結(jié)果如下圖所示

                修改文檔樹

                Beautiful Soup的強項是文檔樹的搜索,但同時也可以方便的修改文檔樹

                • 修改tag的名稱和屬性

                from bs4 import BeautifulSoupimport requestssoup = BeautifulSoup(‘Extremely bold‘,”lxml”)tag = soup.btag.name = “newtag”tag[‘class’] = ‘newclass’tag[‘id’] = 1print(tag)del tag[‘class’]print(tag)

                運行結(jié)果如下圖所示

                • 修改標簽內(nèi)容

                給tag的 .string 屬性賦值,就相當于用當前的內(nèi)容替代了原來的內(nèi)容,如果當前的tag包含了其它tag,那么給它的 .string 屬性賦值會覆蓋掉原有的所有內(nèi)容包括子tag

                from bs4 import BeautifulSoupimport requestsmarkup = ‘I linked to example.com’soup = BeautifulSoup(markup,”lxml”)tag = soup.atag.string = “New link text.”print(tag)

                運行結(jié)果如下圖所示

                • 在tag中添加內(nèi)容

                Tag.append() 方法可以在tag中添加內(nèi)容

                from bs4 import BeautifulSoupimport requestssoup = BeautifulSoup(“Foo”,”lxml”)soup.a.append(“Bar”)print(soup)print(soup.a.contents)

                運行結(jié)果如下圖所示

                總結(jié)

                本篇內(nèi)容比較多,把 Beautiful Soup 的方法進行了大部分整理和總結(jié),但是還不夠完整只是列出一些常用的,如果需要完整的可以查看Beautiful Soup 官網(wǎng)的文檔,希望對大家有幫助,掌握了 Beautiful Soup,一定會給你在數(shù)據(jù)爬取帶來方便,下一期我將分享Python pands庫,如果對我的文章感興趣可以關注我,如果有想了解的Python庫也可以在評論留言,我將采納你們的意見寫一篇文章來分享給大家。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年9月14日 12:22
                下一篇 2022年9月14日 12:22

                相關推薦

                • 短視頻策劃內(nèi)容的3個要點(短視頻策劃內(nèi)容怎么做)

                  短視頻在制作時,內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過時了。現(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

                  2022年11月27日
                • 小紅書平臺的一些機制及玩法詳解(小紅書玩法有哪些)

                  關于小紅書 一:小紅書平臺的一些機制 1. 筆記內(nèi)容的CES評分機制 2. 筆記流量入口與長尾效應 二:小紅書優(yōu)質(zhì)筆記的特點(分維度、類型分析) 1.筆記的本身架構(gòu)組成 維度 2.…

                  2022年11月25日
                • 博客營銷的3大優(yōu)勢解析(博客營銷怎么做)

                  不知不覺已經(jīng)寫了24篇文章,加上這篇是第25篇了,都是自己這幾年來用過的營銷方法,如果遇到有些不懂的,我會咨詢我的朋友和同事幫忙,盡量讓每一篇有價值,哪怕是對大家有一點點幫助也行,…

                  2022年11月25日
                • 什么是內(nèi)容營銷策略如何策劃一套成功的內(nèi)容營銷策略

                  很多時候,營銷人員會在創(chuàng)作營銷內(nèi)容時感到沮喪,這也是很多企業(yè)至今沒用好數(shù)字化營銷工具的重要原因之一。 舉個例子,您可能會花上數(shù)小時期待制作一些令人驚嘆的東西,實際卻是得到很少的受眾…

                  2022年11月25日
                • 直播帶貨詳細腳本(直播文案策劃怎么寫)

                  短視頻運營策劃方案怎么寫?涉及哪幾個方面? 我在網(wǎng)上看到好多千篇一律的文章,關于【短視頻運營策劃方案】這一塊,基本都是在講賬號的內(nèi)容本身。 你內(nèi)容做得再好,卻不掌握算法的規(guī)律,能有…

                  2022年11月25日
                • 閑魚上怎么賣東西快?閑魚賺錢必知技巧(怎么在閑魚里面賣東西)

                  自從閑魚這個平臺出現(xiàn)以后,隨著這些年的發(fā)展,閑魚也成為了很多人開店賺錢的重要途徑。一些新人也想在閑魚上試試水,看看能不能賺到錢。如今閑魚上既可以賣二手閑置物品,也可以賣一些新品,那…

                  2022年11月25日
                • 淘寶直播帶貨技巧分享(淘寶直播復制粘貼技巧)

                  淘寶是大家喜歡的購物平臺,不少人會自己在淘寶選購,也會在主播直播間購買,價格更實惠,現(xiàn)在很多商家都會開通直播帶貨功能,增加訂單量,那么淘寶直播帶貨有哪些?下面小編為大家?guī)硖詫氈辈ァ?/p>

                  2022年11月24日
                • 淘寶直播新主播熬過三個月后怎么做起來(淘寶主播小田直播假貨)

                  想做直播帶貨,起步階段都是比較難的,因此做主播一定要能堅持下去,大家所聽到的這個主播月入十萬那個主播月入百萬,其實背后付出的東西遠遠是你們想不到的。那么,淘寶直播新主播熬過三個月后…

                  2022年11月23日
                • 抖加是怎么收費的(抖加是什么意思)

                  玩過抖音的朋友相信大家都有聽過這樣的一個詞,抖加!首先我們應該也清楚抖加是什么,抖加就是為抖音創(chuàng)作者提供的一個視頻加熱工具,能夠提升視頻播放量與互動量,粉絲量,提升內(nèi)容的曝光效果,…

                  2022年11月22日
                • 平臺運營工作內(nèi)容有哪些平臺運營包含哪些內(nèi)容

                  按性質(zhì)來分,可以分為以下四種。產(chǎn)品運營、內(nèi)容運營、活動運營、用戶運營 一、產(chǎn)品運營:成為一名好的產(chǎn)品經(jīng)理已經(jīng)不容易了,想要成為資深產(chǎn)品運營那更是難上加難。確定目標:產(chǎn)品是什么?產(chǎn)品…

                  2022年11月21日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時間:周一至周五,10:30-18:30,節(jié)假日休息