溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

BeautifulSoup常用語法有哪些

發(fā)布時間:2022-10-12 15:23:57 來源:億速云 閱讀:197 作者:iii 欄目:web開發(fā)

本篇內(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>

創(chuàng)建beautifulsoup4對象

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四大對象種類

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")

CSS選擇器

  • 通過標簽名查找

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ù)學習!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI