bs4的簡單使用


一.使用流程

    解析流程:
        1.pip install bs4
2.導包:from bs4 import BeautifulSoup
3.實例化一個BeautifulSoup對象(將頁面源碼數據加載到該對象中)
      (1)轉化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml')
      (2)轉化網絡文件: - soup = BeautifulSoup('字符串類型或者字節類型', 'lxml')

4.調用BeautifulSoup對象中的相關屬性和方法進行標簽的定位

二.基本語法

基礎鞏固:
    (1)根據標簽名查找
        - soup.a   只能找到第一個符合要求的標簽
    (2)獲取屬性
        - soup.a.attrs  獲取a所有的屬性和屬性值,返回一個字典
        - soup.a.attrs['href']   獲取href屬性
        - soup.a['href']   也可簡寫為這種形式
    (3)獲取內容
        - soup.a.string      獲取a標簽的直系文本
        - soup.a.text     這是屬性,獲取a子類的所有文本
        - soup.a.get_text()  這是方法,獲取a標簽子類的所有文本
       【注意】如果標簽還有標簽,那么string獲取到的結果為None,而其它兩個,可以獲取文本內容
    (4)find:找到第一個符合要求的標簽
        - soup.find('a')  找到第一個符合要求的
        - soup.find('a', title="xxx") 具有title=a屬性的
        - soup.find('a', alt="xxx")
        - soup.find('a', class_="xxx")
        - soup.find('a', id="xxx")
    (5)find_all:找到所有符合要求的標簽
        - soup.find_all('a')
        - soup.find_all(['a','b']) 找到所有的a和b標簽
        - soup.find_all('a', limit=2)  限制前兩個
    (6)根據選擇器選擇指定的內容
               select:soup.select('#feng')
        - 常見的選擇器:標簽選擇器(a)、類選擇器(.)、id選擇器(#)、層級選擇器
            - 層級選擇器:
                div .dudu #lala .meme .xixi  下面好多級
                div > p > a > .lala          只能是下面一級
        select就是css選擇器 【注意】select選擇器返回永遠是列表,需要通過下標提取指定的對象

三.重點語法find和find_all

  1. name參數的四種過濾器
   soup=Beautifulsoup('page','lxml')
    •  不帶過濾器: print(soup.find_all())  #沒有過濾,查找所有標簽
    • 字符串過濾器: print (soup.find_all())  #字符串過濾器,即標簽名
    • 列表: print(soup.find_(['a','b'])) #找到所有的a標簽和b標簽,任一即可
    • 正則:   print(soup.find_all(re.complie('^b'))) #找到所有b開頭的標簽
    • 方法: 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))
  2、按照類名查找,注意關鍵字是class_,class_=value,value可以是五種選擇器之一
       print(soup.find_all('a',class_='sister')) #查找類為sister的a標簽
       print(soup.find_all('a',class_='sister ssss')) #查找類為sister和sss的a標簽,順序錯誤也匹配不成功
       print(soup.find_all(class_=re.compile('^sis'))) #查找類為sister的所有標簽

  3、attrs
    print(soup.find_all('p',attrs={'class':'story'}))

  4、text: 值可以是:字符,列表,True,正則
    print(soup.find_all(text='Elsie'))
    print(soup.find_all('a',text='Elsie'))
  
`
  5、limit參數:如果文檔樹很大那么搜索會很慢.如果我們不需要全部結果,可以使用 limit 參數限制返回結果的數量.效果與SQL中的limit關鍵字類似,
  當搜索到的結果數量達到 limit 的限制時,就停止搜索返回結果     print(soup.find_all('a',limit=2))


  6、recursive:調用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的所有子孫節點,如果只想搜索tag的直接子節點,可以使用參數 recursive=False .     print(soup.html.find_all('a'))     print(soup.html.find_all('a',recursive=False))

  7.find和find_all一樣

 

 

四.爬取小說

import requests
from bs4 import BeautifulSoup

'''
    解析流程:
        1.pip install bs4
        2.導包:from bs4 import BeautifulSoup
        3.實例化一個BeautifulSoup對象(將頁面源碼數據加載到該對象中)
        4.調用BeautifulSoup對象中的相關屬性和方法進行標簽的定位
'''

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
}
url='http://www.shicimingju.com/book/sanguoyanyi.html'
page_text=requests.get(url=url,headers=headers).text

bs4=BeautifulSoup(page_text,'lxml')
#返回一個li列表
li_list=bs4.select('.book-mulu>ul>li')
f=open('./bs-三國','w',encoding='utf-8')
for li in li_list:
    detail_url='http://www.shicimingju.com'+li.a['href']
    detail_page_text=requests.get(detail_url).text
    bs=BeautifulSoup(detail_page_text)
    title=bs.select('.www-main-container>h1')[0].text #select返回的是列表
    content=bs.find('div',class_='chapter_content').text

    f.write(title+'\n'+content)
    print(title+':下載成功')

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM