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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫:使用BeautifulSoup进行查找

發布時間:2024/9/5 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫:使用BeautifulSoup进行查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?網頁中有用的信息通常存在于網頁中的文本或各種不同標簽的屬性值,為了獲得這些網頁信息,有必要有一些查找方法可以獲取這些文本值或標簽屬性。而Beautiful Soup中內置了一些查找方式:

  • ?????????? find()
  • ???????????find_all()
  • ???????????find_parent()
  • ?????????? find_parents()
  • ?????????? find_next_sibling()
  • ?????????? find_next_siblings()
  • ?????????? find_previous_sibling()
  • ????????? ?find_previous_siblings()
  • ?????????? find_previous()
  • ?????????? find_all_previous()
  • ???????????find_next()
  • ?????????? find_all_next()

????????使用find()查找

以下這段HTML是例程要用到的參考網頁

[html] view plaincopy print?
  • <html>??
  • ????<body>??
  • ????????<div?class="ecopyramid">??
  • ????????<ul?id="producers">??
  • ????????????<li?class="producerlist">??
  • ????????????????<div?class="name">plants</div>??
  • ????????????????<div?class="number">100000</div>??
  • ????????????</li>??
  • ????????????<li?class="producerlist">??
  • ????????????????<div?class="name">algae</div>??
  • ????????????????<div?class="number">100000</div>??
  • ????????????</li>??
  • ????????</ul>??
  • ????????<ul?id="primaryconsumers">??
  • ????????????<li?class="primaryconsumerlist">??
  • ????????????????<div?class="name">deer</div>??
  • ????????????????<div?class="number">1000</div>??
  • ????????????</li>??
  • ????????????<li?class="primaryconsumerlist">??
  • ????????????????<div?class="name">rabbit</div>??
  • ????????????????<div?class="number">2000</div>??
  • ????????????</li>??
  • ????????<ul>??
  • ????????<ul?id="secondaryconsumers">??
  • ????????????<li?class="secondaryconsumerlist">??
  • ????????????????<div?class="name">fox</div>??
  • ????????????????<div?class="number">100</div>??
  • ????????????</li>??
  • ????????????<li?class="secondaryconsumerlist">??
  • ????????????????<div?class="name">bear</div>??
  • ????????????????<div?class="number">100</div>??
  • ????????????</li>??
  • ????????</ul>??
  • ????????<ul?id="tertiaryconsumers">??
  • ????????????<li?class="tertiaryconsumerlist">??
  • ????????????????<div?class="name">lion</div>??
  • ????????????????<div?class="number">80</div>??
  • ????????????</li>??
  • ????????????<li?class="tertiaryconsumerlist">??
  • ????????????????<div?class="name">tiger</div>??
  • ????????????????<div?class="number">50</div>??
  • ????????????</li>??
  • ????????</ul>??
  • ????</body>??
  • </html>??

  • 以上代碼是一個生態金字塔的簡單展示,為了找到其中的第一生產者,第一消費者或第二消費者,我們可以使用Beautiful Soup的查找方法。一般來說,為了找到BeautifulSoup對象內任何第一個標簽入口,我們可以使用find()方法。

    找到第一生產者

    可以明顯看到,生產者在第一個<ul>標簽里,因為生產者是在整個HTML文檔中第一個<ul>標簽中出現,所以可以簡單的使用find()方法找到第一生產者。下圖HTML樹代表了第一個生產者所在位置。

    然后在ecologicalpyramid.py中寫入下面一段代碼,使用ecologicalpyramid.html文件創建BeautifulSoup對象。

    [python] view plaincopy print?
  • from?bs4?import?BeautifulSoup??
  • with?open("ecologicalpyramid.html","r")?as?ecological_pyramid:??
  • soup?=?BeautifulSoup(ecological_pyramid)??
  • producer_entries?=?soup.find("ul")??
  • print(producer_entries.li.div.string)??

  • ?輸出得到:plants


    find()說明

    find()函數如下:

    find(name,attrs,recursive,text,**wargs)

    這些參數相當于過濾器一樣可以進行篩選處理。

    不同的參數過濾可以應用到以下情況:

    • 查找標簽,基于name參數
    • 查找文本,基于text參數
    • 基于正則表達式的查找
    • 查找標簽的屬性,基于attrs參數
    • 基于函數的查找

    ?通過標簽查找

    我們可以傳遞任何標簽的名字來查找到它第一次出現的地方。找到后,find函數返回一個BeautifulSoup的標簽對象。

    [python] view plaincopy print?
  • from?bs4?import?BeautifulSoup??
  • ??
  • with?open("ecologicalpyramid.html",?"r")?as?ecological_pyramid:??
  • ????soup?=?BeautifulSoup(ecological_pyramid,"html")??
  • producer_entries?=?soup.find("ul")??
  • print(type(producer_entries))??

  • 輸出的得到?<class 'bs4.element.Tag'>

    通過文本查找

    直接字符串的話,查找的是標簽。如果想要查找文本的話,則需要用到text參數。如下所示:

    [html] view plaincopy print?
  • from?bs4?import?BeautifulSoup??
  • ??
  • with?open("ecologicalpyramid.html",?"r")?as?ecological_pyramid:??
  • ????soup?=?BeautifulSoup(ecological_pyramid,"html")??
  • plants_string?=?soup.find(text="plants")??
  • print(plants_string)??

  • 輸出:plants

    通過正則表達式查找

    有以下HTML代碼:

    [html] view plaincopy print?
  • <br/>??
  • <div>The?below?HTML?has?the?information?that?has?email?ids.</div>???
  • abc@example.com??
  • <div>xyz@example.com</div>??
  • <span>foo@example.com</span>??

  • 如果想找出第一個郵箱地址,但是由于第一個郵箱地址沒有標簽包含,所以通過其他方式很難找到。但是我們可以把郵箱地址進行正則表達式處理,這樣就容易多了。

    參考如下代碼:

    [python] view plaincopy print?
  • import?re??
  • from?bs4?import?BeautifulSoup??
  • ??
  • email_id_example?=?"""<br/>?
  • <div>The?below?HTML?has?the?information?that?has?email?ids.</div>??
  • abc@example.com?
  • <div>xyz@example.com</div>?
  • <span>foo@example.com</span>?
  • """??
  • ??
  • soup?=?BeautifulSoup(email_id_example)??
  • emailid_regexp?=?re.compile("\w+@\w+\.\w+")??
  • first_email_id?=?soup.find(text=emailid_regexp)??
  • print(first_email_id)??

  • 輸出:abc@example.com

    通過標簽屬性進行查找

    觀看例程HTML代碼,其中第一消費者在ul標簽里面且id屬性為priaryconsumers.

    因為第一消費者出現的ul不是文檔中第一個ul,所以通過前面查找標簽的辦法就行不通了?,F在通過標簽屬性進行查找,參考代碼如下:

    [python] view plaincopy print?
  • from?bs4?import?BeautifulSoup??
  • ??
  • with?open("ecologicalpyramid.html",?"r")?as?ecological_pyramid:??
  • ????soup?=?BeautifulSoup(ecological_pyramid,"html")??
  • primary_consumer?=?soup.find(id="primaryconsumers")??
  • print(primary_consumer.li.div.string)??

  • 輸出:deer

    通過標簽屬性查找的方式適用于大多數標簽屬性,包括id,style,title,但是有一組標簽屬性例外。

    • Custom attrbutes
    • Class
    此時,我們需要借助attrs參數來進行傳遞。

    基于定制屬性的查找


    比如我們HTML5標簽中的data-custom屬性,如果我們這樣 [python] view plaincopy print?
  • customattr?=?""'<p?data-custom="custom">custom?attribute???
  • example</p>"""??
  • customsoup?=?BeautifulSoup(customattr,'lxml')??
  • customSoup.find(data-custom="custom")??

  • 那么則會報錯。原因是在Python中變量不能呢含有-這個字符,而我們傳遞的data-custom有-這個字符。 解決的辦法是在attrs屬性用字典進行傳遞參數。 [python] view plaincopy print?
  • using_attrs?=?customsoup.find(attrs={'data-custom':'custom'})??
  • print(using_attrs)??

  • 基于CSS類的查找


    因為class是Python的保留關鍵字,所以無法使用class這個關鍵字。所以解決辦法類似上面。 [python] view plaincopy print?
  • css_class?=?soup.find(attrs={'class':'primaryconsumerlist'})??
  • print(css_class)??

  • 還有另一個辦法。BeautifulSoup有一個特別的關鍵字參數class_。示例: 方法1: [python] view plaincopy print?
  • css_class?=?soup.find(class_?=?"primaryconsumers"?)???

  • 方法2: [python] view plaincopy print?
  • css_class?=?soup.find(attrs={'class':'primaryconsumers'})??

  • 基于定義的函數進行查找

    可以傳遞函數到find()來基于函數定義的條件進行查找。函數值必須返回true或者false。 例子: [python] view plaincopy print?
  • def?is_secondary_consumers(tag):??
  • return?tag.has_attr('id')?and?tag.get('id')?==???
  • 'secondaryconsumers'??
  • [python] view plaincopy print?
  • secondary_consumer?=?soup.find(is_secondary_consumers)??
  • print(secondary_consumer.li.div.string)??

  • 輸出:fox

    把方法進行組合后進行查找


    可以用其中任何方法進行組合來進行查找,比如同時基于標簽名和id號。

    使用find_all查找

    find()用來查找第一個匹配結果出現的地方,而find_all()正如名字所示,將會找到所有匹配結果出現的地方。應用到find()中的不同過濾參數同理可以用到find_all()中,實際上,過濾參數可以用于任何查找函數,如find_parents()或和find_siblings()。

    查找所有三級消費者

    [python] view plaincopy print?
  • all_tertiaryconsumers?=???
  • soup.find_all(class_="tertiaryconsumerslist")??

  • 其all_tertiaryconsumers的類型是列表。 所以我們對其列表進行迭代,循環輸出三級消費者的名字。 [python] view plaincopy print?
  • for?tertiaryconsumer?in?all_tertiaryconsumers:??
  • print(tertiaryconsumer.div.string)??

  • 輸出: lion tiger

    理解用于find_all()的參數


    相比find(),find_all()有個額外的參數limit,如下所示: find_all(name,attrs,recursive,text,limit,**kwargs)
    limit參數可以限制我們想要得到結果的數目。參照前面的郵件地址例子,我們可以得到所有右鍵地址通過: [python] view plaincopy print?
  • email_ids?=?soup.find_all(text=emailid_regexp)??
  • print(email_ids)??

  • 輸出:[u'abc@example.com',u'xyz@example.com',u'foo@example.com']
    當我們使用limit參數,效果如下: [python] view plaincopy print?
  • email_ids_limited?=?soup.find_all(text=emailid_regexp,limit=2)??
  • print(email_ids_limited)??

  • 限制得到兩個結果,所以輸出為: [u'abc@example.com',u'xyz@example.com']
    說白了,find()也就是當limit=1時的find_all()。
    可以向find函數傳遞True或False參數,如果我們傳遞True給find_all(),則返回所有soup對象的標簽。對于find()來說,則返回第一個標簽。 舉例查找文本,傳遞True將會返回所有文本。 [python] view plaincopy print?
  • all_texts?=?soup.find_all(text=True)??
  • print(all_texts)??

  • 輸出: [u'\n', u'\n', u'\n', u'\n', u'\n', u'plants', u'\n', u'100000',?
    u'\n', u'\n', u'\n', u'algae', u'\n', u'100000', u'\n', u'\n',?
    u'\n', u'\n', u'\n', u'deer', u'\n', u'1000', u'\n', u'\n',?
    u'\n', u'rabbit', u'\n', u'2000', u'\n', u'\n', u'\n',?
    u'\n', u'\n', u'fox', u'\n', u'100', u'\n', u'\n', u'\n',?
    u'bear', u'\n', u'100', u'\n', u'\n', u'\n', u'\n',?
    u'\n', u'lion', u'\n', u'80', u'\n', u'\n', u'\n',?
    u'tiger', u'\n', u'50', u'\n', u'\n', u'\n', u'\n',?
    u'\n']?

    同樣的,我們可以在傳遞text參數時傳遞一個字符串列表,那么find_all()會找到誒個在列表中定義過的字符串。 [python] view plaincopy print?
  • all_texts_in_list?=?soup.find_all(text=["plants","algae"])??
  • print(all_texts_in_list)??

  • 輸出: [python] view plaincopy print?
  • [u'plants',?u'algae']??

  • 這個同樣適用于查找標簽,標簽屬性,定制屬性和CSS類。如: [python] view plaincopy print?
  • div_li_tags?=?soup.find_all(["div","li"])??

  • find()和find_all()都會查找一個對象所有后輩們,不過我們可以控制它通過recursive參數。如果recursive=False,那么超找只會找到該對象的最近后代。

    通過標簽之間的關系進行查找

    我們可以通過find()和find_all()來查找到想要內容。但有時候,我們需要查看的與之內容相關先前的標簽或者后面的標簽來獲取額外的信息。比如方法find_parents()和find_next_siblings()等等。一般的,在find()和find_all()方法后使用上述方法,因為find()和find_all()可以找到特殊的一個標簽,然后我們可以通過這個特殊的標簽找到其他的想要的與之有關系的標簽。

    查找父標簽

    通過find_parents()或find_parent()。它們之間的不同就類似于find()和find_all()的區別。find_parents()返回全部的相匹配的父標簽,而find_paret()返回最近的一個父標簽。適用于find()的方法同樣也使用于這兩個方法。
    在前面的第一消費者例子中,我們可以找到離Primaryconsumer最近的ul父標簽。 [python] view plaincopy print?
  • primaryconsumers?=?soup.find_all(class_="primaryconsumerlist")??
  • primaryconsumer?=?primaryconsumers[0]??
  • parent_ul?=?primaryconsumer.find_parents('ul')??
  • print(parent_ul)??

  • 一個簡單的找到一個標簽的父標簽的方法就是使用find_parent()卻不帶任何參數。 [python] view plaincopy print?
  • immediateprimary_consumer_parent?=?primary_consumer.find_parent()??

  • 查找同胞


    如果標簽在同一個等級的話,我們可以說這些標簽是同胞的關系,比如參照上面金字塔例子,所有ul標簽就是同胞的關系。

    上圖ul標簽下的producers,primaryconsumers,secondaryconsumers,teriaryconsumers就是同胞關系。 再看下面這個圖:

    div下的plants和algae不是同胞關系,但是plants和臨近的number是同胞關系。 Beautiful Soup自帶有查找同胞的方法。 比如find_next_siblings()和find_next_sibling()查找對象下面的同胞。舉例: [python] view plaincopy print?
  • producers=?soup.find(id='producers')??
  • next_siblings?=?producers.find_next_siblings()??
  • print(next_siblings)??

  • 將會輸出與之臨近的下面的所有同胞HTML代碼。

    查找下一個

    對每一個標簽來說,下一個元素可能會是定位字符串,標簽對象或者其他BeautifulSoup對象。我們定義下一個元素為與當前元素最靠近的元素。這個不同于同胞定義。我們有方法可以找到我們想要標簽的下一個其他元素對象。find_all_next()找到與當前元素靠近的所有對象。而find_next()找到離當前元素最接近的對象。

    比如,找到在第一個div標簽后的所有li標簽 [python] view plaincopy print?
  • first_div?=?soup.div??
  • all_li_tags?=?first_div.find_all_next("li")??

  • 輸出“: [<li class="producerlist">
    <div class="name">plants</div>
    <div class="number">100000</div>
    </li>, <li class="producerlist">
    <div class="name">algae</div>
    <div class="number">100000</div>
    </li>, <li class="primaryconsumerlist">
    <div class="name">deer</div>
    <div class="number">1000</div>
    </li>, <li class="primaryconsumerlist">
    <div class="name">rabbit</div>
    <div class="number">2000</div>
    </li>, <li class="secondaryconsumerlist">
    <div class="name">fox</div>
    <div class="number">100</div>
    </li>, <li class="secondaryconsumerlist">
    <div class="name">bear</div>
    <div class="number">100</div>
    </li>, <li class="tertiaryconsumerlist">
    <div class="name">lion</div>
    <div class="number">80</div>
    </li>, <li class="tertiaryconsumerlist">
    <div class="name">tiger</div>
    <div class="number">50</div>
    </li>]

    查找上一個

    與查找下一個相反的是查找前一個。同理用于find_all_previous()和find_all_previous()

    轉載于:https://www.cnblogs.com/yizhenfeng168/p/6972946.html

    總結

    以上是生活随笔為你收集整理的python爬虫:使用BeautifulSoup进行查找的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美综合视频在线观看 | av色播| 四虎永久免费地址 | 日韩a级一片 | 精品无码国产av一区二区三区 | 国产白浆在线观看 | 91丨九色| 久插视频 | 伊人看片 | 鲁一鲁av| 91自啪 | 依人成人 | 九色视频91 | 久草蜜桃 | 欧美91精品久久久久国产性生爱 | 亚洲av人人澡人人爽人人夜夜 | 老司机精品视频在线播放 | 午夜黄色影院 | 欧美高清一区二区 | 国产综合久久久 | 性生活视频播放 | 麻豆久久久午夜一区二区 | 成人日韩在线观看 | 啪啪免费视频网站 | 91社区福利 | 天天操国产| 久久久蜜桃 | 婷色| 日产电影一区二区三区 | av网站在线免费观看 | 91九色网 | 亚洲琪琪 | 一区二区在线免费看 | 中文字幕亚洲不卡 | 不卡一区二区在线观看 | 97久久精品视频 | 男人狂揉女人下部视频 | 国产精品调教视频 | 青青视频网 | 黄色片特级 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 久久久ww | 老妇女av | 色日韩 | 中文字幕三级视频 | av老司机在线 | 厨房性猛交hd| 国产在线网址 | 鲁一鲁av| 国产一二三四在线 | 美女扒开屁股让男人桶 | 国产一区二区三区www | 欧美激情喷水 | 91在线视频网址 | 杂技xxx裸体xxxx欧美 | 伊人91 | 韩国美女福利视频 | 99热这里| 亚洲乱色熟女一区二区 | 在线播放av片 | 亚洲一区久久 | 一个色综合导航 | 深夜av在线 | 欧洲成人在线观看 | 国产一级二级 | 欧美一区二区免费在线观看 | 国产aaa视频 | 亚州激情视频 | 成人激情视频在线观看 | 永久免费av网站 | 亚洲少妇一区 | 国产精品高潮呻吟久久aⅴ码 | 日本中文字幕免费观看 | 午夜精品国产精品大乳美女 | 奇米影视77777 | av在线一区二区 | 亚洲欧美国产高清 | 欧美三级午夜理伦三级老人 | 在线观看色网 | 激情伊人 | 9i在线看片成人免费 | 少妇2做爰bd在线意大利堕落 | 亚洲欧美色图片 | 日韩免费av网站 | 香蕉久久国产 | 欧美日韩首页 | 3d毛片 | 亚洲欧洲一区二区 | 在线免费观看日韩视频 | 欧美成人黑人xx视频免费观看 | 美女免费网站 | 天天躁日日躁狠狠躁 | 黑森林av凹凸导航 | 狠狠躁日日躁夜夜躁av | 国产乱码一区二区三区在线观看 | 免费又黄又爽又猛大片午夜 | 久久久久二区 | 日本精品免费在线观看 | 又色又爽又高潮免费视频国产 |