最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?beautifulsoup4?模塊詳情

 更新時間:2022年05月17日 11:25:35   作者:??夢想橡皮擦????  
本文主要介紹了python?beautifulsoup4模塊詳情,BeautifulSoup4是一款python解析庫,主要用于解析HTML和XML,在爬蟲知識體系中解析?HTML?會比較多一些,下文更多相關內容,需要的小伙伴可以參考一下

一、BeautifulSoup4 基礎知識補充

BeautifulSoup4 是一款 python 解析庫,主要用于解析 HTML 和 XML,在爬蟲知識體系中解析 HTML 會比較多一些,

該庫安裝命令如下:

pip install beautifulsoup4

BeautifulSoup 在解析數(shù)據時,需依賴第三方解析器,常用解析器與優(yōu)勢如下所示:

  • python 標準庫 html.parser:python 內置標準庫,容錯能力強;
  • lxml 解析器:速度快,容錯能力強;
  • html5lib:容錯性最強,解析方式與瀏覽器一致。

接下來用一段自定義的 HTML 代碼來演示 beautifulsoup4 庫的基本使用,測試代碼如下:

<html>
  <head>
    <title>測試bs4模塊腳本</title>
  </head>
  <body>
    <h1>橡皮擦的爬蟲課</h1>
    <p>用一段自定義的 HTML 代碼來演示</p>
  </body>
</html>

使用 BeautifulSoup 對其進行簡單的操作,包含實例化 BS 對象,輸出頁面標簽等內容。

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>測試bs4模塊腳本</title>
	</head>
	<body>
		<h1>橡皮擦的爬蟲課</h1>
		<p>用1段自定義的 HTML 代碼來演示</p>
		<p>用2段自定義的 HTML 代碼來演示</p>
	</body>
</html>
"""
# 實例化 Beautiful Soup 對象
soup = BeautifulSoup(text_str, "html.parser")
# 上述是將字符串格式化為 Beautiful Soup 對象,你可以從一個文件進行格式化
# soup = BeautifulSoup(open('test.html'))
print(soup)
# 輸入網頁標題 title 標簽
print(soup.title)
# 輸入網頁 head 標簽
print(soup.head)

# 測試輸入段落標簽 p
print(soup.p) # 默認獲取第一個

我們可以通過 BeautifulSoup 對象,直接調用網頁標簽,這里存在一個問題,通過 BS 對象調用標簽只能獲取排在第一位置上的標簽,如上述代碼中,只獲取到了一個 p 標簽,如果想要獲取更多內容,請繼續(xù)閱讀。

學習到這里,我們需要了解 BeautifulSoup 中的 4 個內置對象:

  • BeautifulSoup:基本對象,整個 HTML 對象,一般當做 Tag 對象看即可;
  • Tag:標簽對象,標簽就是網頁中的各個節(jié)點,例如 title,head,p;
  • NavigableString:標簽內部字符串;
  • Comment:注釋對象,爬蟲里面使用場景不多。

下述代碼為你演示這幾種對象出現(xiàn)的場景,注意代碼中的相關注釋:

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>測試bs4模塊腳本</title>
	</head>
	<body>
		<h1>橡皮擦的爬蟲課</h1>
		<p>用1段自定義的 HTML 代碼來演示</p>
		<p>用2段自定義的 HTML 代碼來演示</p>
	</body>
</html>
"""
# 實例化 Beautiful Soup 對象
soup = BeautifulSoup(text_str, "html.parser")
# 上述是將字符串格式化為 Beautiful Soup 對象,你可以從一個文件進行格式化
# soup = BeautifulSoup(open('test.html'))
print(soup)
print(type(soup))  # <class 'bs4.BeautifulSoup'>
# 輸入網頁標題 title 標簽
print(soup.title)
print(type(soup.title)) # <class 'bs4.element.Tag'>
print(type(soup.title.string)) # <class 'bs4.element.NavigableString'>
# 輸入網頁 head 標簽
print(soup.head)

對于 Tag 對象,有兩個重要的屬性,是 name 和 attrs

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>測試bs4模塊腳本</title>
	</head>
	<body>
		<h1>橡皮擦的爬蟲課</h1>
		<p>用1段自定義的 HTML 代碼來演示</p>
		<p>用2段自定義的 HTML 代碼來演示</p>
		<a  rel="external nofollow"  rel="external nofollow" >CSDN 網站</a>
	</body>
</html>
"""
# 實例化 Beautiful Soup 對象
soup = BeautifulSoup(text_str, "html.parser")
print(soup.name) # [document]
print(soup.title.name) # 獲取標簽名 title
print(soup.html.body.a) # 可以通過標簽層級獲取下層標簽
print(soup.body.a) # html 作為一個特殊的根標簽,可以省略
print(soup.p.a) # 無法獲取到 a 標簽
print(soup.a.attrs) # 獲取屬性

上述代碼演示了獲取 name 屬性和 attrs 屬性的用法,其中 attrs 屬性得到的是一個字典,可以通過鍵獲取對應的值。

獲取標簽的屬性值,在 BeautifulSoup 中,還可以使用如下方法:

print(soup.a["href"])
print(soup.a.get("href"))

獲取 NavigableString 對象 獲取了網頁標簽之后,就要獲取標簽內文本了,通過下述代碼進行。

print(soup.a.string)

除此之外,你還可以使用 text 屬性和 get_text() 方法獲取標簽內容。

print(soup.a.string)
print(soup.a.text)
print(soup.a.get_text())

還可以獲取標簽內所有文本,使用 strings 和 stripped_strings 即可。

print(list(soup.body.strings)) # 獲取到空格或者換行
print(list(soup.body.stripped_strings)) # 去除空格或者換行

擴展標簽/節(jié)點選擇器之遍歷文檔樹

直接子節(jié)點

標簽(Tag)對象的直接子元素,可以使用 contents 和 children 屬性獲取。

from bs4 import BeautifulSoup
text_str = """<html>
	<head>
		<title>測試bs4模塊腳本</title>
	</head>
	<body>
		<div id="content">
			<h1>橡皮擦的爬蟲課<span>最棒</span></h1>
            <p>用1段自定義的 HTML 代碼來演示</p>
            <p>用2段自定義的 HTML 代碼來演示</p>
            <a  rel="external nofollow"  rel="external nofollow" >CSDN 網站</a>
		</div>
        <ul class="nav">
            <li>首頁</li>
            <li>博客</li>
            <li>專欄課程</li>
        </ul>

	</body>
</html>
"""
# 實例化 Beautiful Soup 對象
soup = BeautifulSoup(text_str, "html.parser")
# contents 屬性獲取節(jié)點的直接子節(jié)點,以列表的形式返回內容
print(soup.div.contents) # 返回列表
# children 屬性獲取的也是節(jié)點的直接子節(jié)點,以生成器的類型返回
print(soup.div.children) # 返回 <list_iterator object at 0x00000111EE9B6340>

請注意以上兩個屬性獲取的都是直接子節(jié)點,例如 h1 標簽內的后代標簽 span ,不會單獨獲取到。

如果希望將所有的標簽都獲取到,使用 descendants 屬性,它返回的是一個生成器,所有標簽包括標簽內的文本都會單獨獲取。

print(list(soup.div.descendants))

其它節(jié)點的獲?。私饧纯桑床榧从茫?/p>

  • parent 和 parents:直接父節(jié)點和所有父節(jié)點;
  • next_sibling,next_siblingsprevious_sibling,previous_siblings:分別表示下一個兄弟節(jié)點、下面所有兄弟節(jié)點、上一個兄弟節(jié)點、上面所有兄弟節(jié)點,由于換行符也是一個節(jié)點,所有在使用這幾個屬性時,要注意一下?lián)Q行符;
  • next_element,next_elements,previous_element,previous_elements:這幾個屬性分別表示上一個節(jié)點或者下一個節(jié)點,注意它們不分層次,而是針對所有節(jié)點,例如上述代碼中 div 節(jié)點的下一個節(jié)點是 h1,而 div 節(jié)點的兄弟節(jié)點是 ul。

文檔樹搜索相關函數(shù)

第一個要學習的函數(shù)就是 find_all() 函數(shù),原型如下所示:

find_all(name,attrs,recursive,text,limit=None,**kwargs)
  • name:該參數(shù)為 tag 標簽的名字,例如 find_all('p') 是查找所有的 p 標簽,可接受標簽名字符串、正則表達式與列表;
  • attrs:傳入的屬性,該參數(shù)可以字典的形式傳入,例如 attrs={'class': 'nav'},返回的結果是 tag 類型的列表;

上述兩個參數(shù)的用法示例如下:

print(soup.find_all('li')) # 獲取所有的 li
print(soup.find_all(attrs={'class': 'nav'})) # 傳入 attrs 屬性
print(soup.find_all(re.compile("p"))) # 傳遞正則,實測效果不理想
print(soup.find_all(['a','p'])) # 傳遞列表
  • recursive:調用 find_all () 方法時,BeautifulSoup 會檢索當前 tag 的所有子孫節(jié)點,如果只想搜索 tag 的直接子節(jié)點,可以使用參數(shù) recursive=False,測試代碼如下:
print(soup.body.div.find_all(['a','p'],recursive=False)) # 傳遞列表
  • text:可以檢索文檔中的文本字符串內容,與 name 參數(shù)的可選值一樣,text 參數(shù)接受標簽名字符串、正則表達式、 列表;
print(soup.find_all(text='首頁')) # ['首頁']
print(soup.find_all(text=re.compile("^首"))) # ['首頁']
print(soup.find_all(text=["首頁",re.compile('課')])) # ['橡皮擦的爬蟲課', '首頁', '專欄課程']
  • limit:可以用來限制返回結果的數(shù)量;
  • kwargs:如果一個指定名字的參數(shù)不是搜索內置的參數(shù)名,搜索時會把該參數(shù)當作 tag 的屬性來搜索。這里要按 class 屬性搜索,因為 class 是 python 的保留字,需要寫作 class_,按 class_ 查找時,只要一個 CSS 類名滿足即可,如需多個 CSS 名稱,填寫順序需要與標簽一致。
print(soup.find_all(class_ = 'nav'))
print(soup.find_all(class_ = 'nav li'))

還需要注意網頁節(jié)點中,有些屬性在搜索中不能作為kwargs參數(shù)使用,比如html5 中的 data-*屬性,需要通過attrs參數(shù)進行匹配。

與 find_all()方法用戶基本一致的其它方法清單如下:

  • find():函數(shù)原型find( name , attrs , recursive , text , **kwargs ),返回一個匹配元素;
  • find_parents(),find_parent():函數(shù)原型 find_parent(self, name=None, attrs={}, **kwargs),返回當前節(jié)點的父級節(jié)點;
  • find_next_siblings(),find_next_sibling():函數(shù)原型 find_next_sibling(self, name=None, attrs={}, text=None, **kwargs),返回當前節(jié)點的下一兄弟節(jié)點;
  • find_previous_siblings(),find_previous_sibling():同上,返回當前的節(jié)點的上一兄弟節(jié)點;
  • find_all_next(),find_next(),find_all_previous () ,find_previous ():函數(shù)原型 find_all_next(self, name=None, attrs={}, text=None, limit=None, **kwargs),檢索當前節(jié)點的后代節(jié)點。

CSS 選擇器 該小節(jié)的知識點與pyquery有點撞車,核心使用select()方法即可實現(xiàn),返回數(shù)據是列表元組。

  • 通過標簽名查找,soup.select("title");
  • 通過類名查找,soup.select(".nav");
  • 通過 id 名查找,soup.select("#content");
  • 通過組合查找,soup.select("div#content");
  • 通過屬性查找,soup.select("div[id='content'")soup.select("a[href]");

在通過屬性查找時,還有一些技巧可以使用,例如:

  • ^=:可以獲取以 XX 開頭的節(jié)點:
print(soup.select('ul[class^="na"]'))
  • *=:獲取屬性包含指定字符的節(jié)點:
print(soup.select('ul[class*="li"]'))

二、爬蟲案例

BeautifulSoup 的基礎知識掌握之后,在進行爬蟲案例的編寫,就非常簡單了,本次要采集的目標網站 ,該目標網站有大量的藝術二維碼,可以供設計大哥做參考。

下述應用到了 BeautifulSoup 模塊的標簽檢索與屬性檢索,完整代碼如下:

from bs4 import BeautifulSoup
import requests
import logging
logging.basicConfig(level=logging.NOTSET)
def get_html(url, headers) -> None:
    try:
        res = requests.get(url=url, headers=headers, timeout=3)
    except Exception as e:
        logging.debug("采集異常", e)

    if res is not None:
        html_str = res.text
        soup = BeautifulSoup(html_str, "html.parser")
        imgs = soup.find_all(attrs={'class': 'lazy'})
        print("獲取到的數(shù)據量是", len(imgs))
        datas = []
        for item in imgs:
            name = item.get('alt')
            src = item["src"]
            logging.info(f"{name},{src}")
            # 獲取拼接數(shù)據
            datas.append((name, src))
        save(datas, headers)
def save(datas, headers) -> None:
    if datas is not None:
        for item in datas:
            try:
                # 抓取圖片
                res = requests.get(url=item[1], headers=headers, timeout=5)
            except Exception as e:
                logging.debug(e)

            if res is not None:
                img_data = res.content
                with open("./imgs/{}.jpg".format(item[0]), "wb+") as f:
                    f.write(img_data)
    else:
        return None
if __name__ == '__main__':
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
    }
    url_format = "http://www.9thws.com/#p{}"
    urls = [url_format.format(i) for i in range(1, 2)]
    get_html(urls[0], headers)

本次代碼測試輸出采用的 logging 模塊實現(xiàn),效果如下圖所示。 測試僅采集了 1 頁數(shù)據,如需擴大采集范圍,只需要修改 main 函數(shù)內頁碼規(guī)則即可。 ==代碼編寫過程中,發(fā)現(xiàn)數(shù)據請求是類型是 POST,數(shù)據返回格式是 JSON,所以本案例僅作為 BeautifulSoup 的上手案例吧== 

到此這篇關于python beautifulsoup4 模塊詳情的文章就介紹到這了,更多相關 python beautifulsoup4 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • pytorch 數(shù)據預加載的實現(xiàn)示例

    pytorch 數(shù)據預加載的實現(xiàn)示例

    在PyTorch中,數(shù)據加載和預處理是深度學習中非常重要的一部分,本文主要介紹了pytorch 數(shù)據預加載的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • python實現(xiàn)門限回歸方式

    python實現(xiàn)門限回歸方式

    今天小編就為大家分享一篇python實現(xiàn)門限回歸方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python爬蟲利器之PhantomJS詳解

    Python爬蟲利器之PhantomJS詳解

    這篇文章主要介紹了Python爬蟲利器之PhantomJS詳解,PhantomJS是一個基于WebKit的無頭瀏覽器,它沒有圖形界面,但是它可以像傳統(tǒng)的瀏覽器一樣訪問web頁面,并返回已呈現(xiàn)的內容,PhantomJS是一種命令行工具,可以用它來測試和爬取Web頁面,需要的朋友可以參考下
    2023-09-09
  • pycharm中出現(xiàn)no module named xlwt的原因及解決

    pycharm中出現(xiàn)no module named xlwt的原因及解決

    這篇文章主要介紹了pycharm中出現(xiàn)no module named xlwt的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。
    2023-05-05
  • python3 使用openpyxl將mysql數(shù)據寫入xlsx的操作

    python3 使用openpyxl將mysql數(shù)據寫入xlsx的操作

    這篇文章主要介紹了python3 使用openpyxl將mysql數(shù)據寫入xlsx的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】

    Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】

    今天小編就為大家分享一篇關于Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • django框架兩個使用模板實例

    django框架兩個使用模板實例

    這篇文章主要介紹了django框架使用模板方法,結合兩個具體實例形式詳細分析了Django框架模板的相關使用技巧與操作注意事項,需要的朋友可以參考下
    2019-12-12
  • 如何使用python3獲取當前路徑及os.path.dirname的使用

    如何使用python3獲取當前路徑及os.path.dirname的使用

    這篇文章主要介紹了如何使用python3獲取當前路徑及os.path.dirname的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Python字符串逆序輸出的實例講解

    Python字符串逆序輸出的實例講解

    今天小編就為大家分享一篇關于Python字符串逆序輸出的實例講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Python Multinomial Naive Bayes多項貝葉斯模型實現(xiàn)原理介紹

    Python Multinomial Naive Bayes多項貝葉斯模型實現(xiàn)原理介紹

    這篇文章主要介紹了Python Multinomial Naive Bayes多項貝葉斯模型實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09

最新評論

安塞县| 科技| 贵德县| 锡林郭勒盟| 丰原市| 富阳市| 甘谷县| 洛川县| 辽中县| 嘉鱼县| 绥棱县| 杂多县| 鹤岗市| 云安县| 海原县| 金塔县| 日喀则市| 香河县| 睢宁县| 英山县| 襄樊市| 长岛县| 德保县| 资源县| 灌云县| 论坛| 昌吉市| 永福县| 北宁市| 乌苏市| 确山县| 壶关县| 文山县| 西昌市| 驻马店市| 永嘉县| 紫金县| 左云县| 城口县| 巴彦县| 临武县|