日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python模块--BeautifulSoup4 和 lxml

發(fā)布時間:2024/9/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python模块--BeautifulSoup4 和 lxml 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BeautifulSoup4和lxml

  這兩個庫主要是解析html/xml文檔,BeautifulSoup 用來解析 HTML 比較簡單,API非常人性化,支持CSS選擇器、

Python標(biāo)準(zhǔn)庫中的HTML解析器,也支持 lxml 的 XML解析器。關(guān)于BeautifulSoup和lxml的實例介紹如下:

一、BeautifulSoup4庫:

  安裝:pip install?beautifulsoup4  如果不寫4會默認安裝beautifulsoup3

  數(shù)據(jù)結(jié)構(gòu)、種類:Beautiful Soup將復(fù)雜HTML文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu),每個節(jié)點都是Python對象,所有對象可

以歸納為4種: Tag  NavigableString  BeautifulSoup  Comment ?。

  Tag: ?即我們在寫網(wǎng)頁時所使用的標(biāo)簽(如<a>超鏈接標(biāo)簽)

  NavigableString:簡單的說就是一種可以遍歷的字符串

?

 搜索文檔:

  使用requests庫獲取網(wǎng)頁源代碼:

  1 import requests2 from bs4 import BeautifulSoup3 url = 'https://www.baidu.com/s?wd=python'4 headers = {5 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',}6 req = requests.session()7 response = req.get(url, headers=headers, verify=False)8 html_test = response.text

  html_test就是獲取的一個網(wǎng)頁源代碼,它沒有爬取到JS的內(nèi)容,所有可能和網(wǎng)頁內(nèi)容不完全一致!

  要解析文檔內(nèi)容之前,先要用BeautifulSoup實例一個對象。如下,它的類型為<class 'bs4.BeautifulSoup'>

?

  1 soup = BeautifulSoup(html_test, 'lxml')2 print(soup, type(soup))

?

  獲取標(biāo)簽Tag:  soup.'標(biāo)簽名' ? ? ?就可以匹配出第一個該標(biāo)簽,它將會把第一次出現(xiàn)的該標(biāo)簽完整的返回。

  1 print(soup.span)

  獲取標(biāo)簽屬性:

?

  1 print(type(soup.a))2 print(soup.a['id']) # 沒有該屬性會報錯3 print(soup.a.attrs) # 輸出標(biāo)簽的屬性和值4 print(soup.a.get('id')) # 推薦使用get取屬性,沒有返回None 代碼的運行結(jié)構(gòu):
  •   <class 'bs4.element.Tag'>
  •   result_logo
  •   {'href': '/', 'id': 'result_logo', 'onmousedown': "return c({'fm':'tab','tab':'logo'})"}
  •   None
  •   獲取文檔內(nèi)容:獲取到標(biāo)簽后(或者是soup),有幾種不同的方法獲取標(biāo)簽里的內(nèi)容,分別如下:

       strings: ?直接加 ?.strings ?返回的是一個生成器,但是作者不能調(diào)用next()方法,查詢之后使用如下

    ?

        1 a = soup.div.strings2 a.__next__()

    ?

       執(zhí)行之后,可以再調(diào)用a.__next__(),這樣會將文本內(nèi)容一條條地返回,但是大多數(shù)時候,這樣做是非常麻煩的。

       ?基于搜索方法find()和find_all()去獲取文本內(nèi)容:

       ?  字符串:soup.find_all('p') ?獲取所有的P標(biāo)簽,返回一個列表,soup.findl('p')只返回一個,類型為'bs4.element.Tag'

    ?

        1 print(soup.find_all('p')[1])2 print(soup.find_all('i', class_='c-icon-lidot')) # 限制屬性class

    ?

         ?字符串里只能是標(biāo)簽名,不能是其他內(nèi)容,否則find_all()獲取的是空列表,find()獲取的是None

         ?find_all()獲取的是列表元素也是類型為 'bs4.element.Tag' !

    ?

         ?正則表達式:需要導(dǎo)入re,再用re.compile()根據(jù)包含的正則表達式的字符串創(chuàng)建模式對象。

        1 import re2 for i in soup.find_all(re.compile('span')):3 print(i.text) # 會將span標(biāo)簽內(nèi)的所有文本內(nèi)容返回

        ??soup.find_all(re.compile('span'))的元素仍然是'bs4.element.Tag' !

         ?列表:find_all方法也能接受列表參數(shù),BeautifulSoup會將與列表中任一元素匹配的內(nèi)容返回。?

    ?

         1 print(soup.find_all(['i', 'a'])) # 獲取所有的i標(biāo)簽和a標(biāo)簽

    ?

         ?返回的數(shù)據(jù)類型為bs4.element.ResultSet,跟列表相似,可以通過索引取值且有序

    ?

         ?方法(調(diào)用函數(shù)體):如果沒有合適的過濾器,我們也可以自定義一個方法,方法只接受一個元素參數(shù)。 ? ??

    ?

        1 def has_class_and_no_id(tag):2 return tag.has_attr('class') and not tag.has_attr('id')3 for tag in soup.find_all(has_class_and_no_id):4 print(tag)5 # soup.find_all(has_class_and_no_id)返回的數(shù)據(jù)類型是'bs4.element.ResultSet'6 # 同上,類似列表,可以索引取值且無序!

    ?

       ?基于select獲取:css選擇器,寫 CSS 時,標(biāo)簽名不加任何修飾,類名前加.,id名前加#;返回值是一個列表

         ?標(biāo)簽名查找:soup.select('h3 a')取h3標(biāo)簽下的a標(biāo)簽;等價于soup.select('h3 > a')

         1 for i in soup.select('h3 a'):2 # text取內(nèi)容時返回的是str字符串3 result_1 = i.text4 # get_text取內(nèi)容時返回的是str字符串5 result_2 = i.get_text()6 # string返回的是NavigableString,沒有內(nèi)容,將返回None7 result_3 = i.string8 # strings返回的是generator 如果內(nèi)容為空,將返回None9 result_4 = i.strings10 print(result_1, type(result_1))11 print(result_2, type(result_2))12 print(result_3, type(result_3))13 print(result_4, type(result_4))

         ?類名查找或id查找:? soup.select('.c-gap-left-small') ? ?soup.select('#content_bottom')

         ?組合查找:?? ?soup.select('a .c-gap-left-small')?? ? ? ? ? ? ? ? ? ??

    搜索

    來源:https://www.cnblogs.com/dan-baishucaizi/p/8494913.html

    總結(jié)

    以上是生活随笔為你收集整理的python模块--BeautifulSoup4 和 lxml的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。