BeautifulSoup


1.BeautifulSoup簡稱:bs4
2.BeautifulSoup,和lxml一樣,是一個html的解析器,主要功能也是解析和提取數據
3.優缺點?缺點:效率沒有lxml的效率高。優點:接口設計人性化,使用方便
 
安裝以及創建
1.安裝
  pip install bs4
2.導入
  from bs4 import BeautifulSoup
3.創建對象
  服務器響應的文件生成對象
soup = BeautifulSoup(response.read().decode(), 'lxml')
  本地文件生成對象
soup = BeautifulSoup(open('1.html'), 'lxml')
  注意:默認打開文件的編碼格式gbk所以需要指定打開編碼格式
 
節點定位
1.根據標簽名查找節點
  soup.a 【注】只能找到第一個a
  soup.a.name
  soup.a.attrs
2.函數
  (1).find(返回一個對象)
  find('a'):只找到第一個a標簽
  find('a', title='名字')
  find('a', class_='名字')
(2).find_all(返回一個列表)
  find_all('a') 查找到所有的a
  find_all(['a', 'span']) 返回所有的a和span
  find_all('a', limit=2) 只找前兩個a
(3).select(根據選擇器得到節點對象)【推薦】
  1.element
    eg:p
  2..class
    eg:.firstname
  3.#id
    eg:#firstname
  4.屬性選擇器
    [attribute]
      eg:li = soup.select('li[class]')
    [attribute=value]
      eg:li = soup.select('li[class="hengheng1"]')
  5.層級選擇器
    element element
      div p
    element>element
      div>p
    element,element
      div,p
    eg:soup = soup.select('a,span')
 
節點信息
  (1).獲取節點內容:適用於標簽中嵌套標簽的結構
    obj.string
    obj.get_text()【推薦】
  (2).節點的屬性
    tag.name 獲取標簽名
      eg:tag = find('li)
        print(tag.name)
    tag.attrs將屬性值作為一個字典返回
(3).獲取節點屬性
  obj.attrs.get('title')【常用】
  obj.get('title')
  obj['title']
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bs4基本使用</title>
</head>
<body>

    <div>
        <ul>
            <li id="l1">張三</li>
            <li id="l2">李四</li>
            <li>王五</li>
            <a href="" id="" class="a1">嚶嚶嚶</a>
            <span>嘿嘿嘿</span>
        </ul>
    </div>


    <a href="" title="a2">百度</a>

    <div id="d1">
        <span> 哈哈哈 </span>
    </div>

    <p id="p1" class="p1">呵呵呵</p>
</body>
</html>
from bs4 import BeautifulSoup # 通過解析本地文件 來將bs4的基礎語法進行講解 # 默認打開的文件的編碼格式是gbk 所以在打開文件的時候需要指定編碼
# 本地文件生成對象 soup = BeautifulSoup(open('bs4的基本使用.html',encoding='utf-8'),'lxml') # 根據標簽名查找節點 # 找到的是第一個符合條件的數據 # print(soup.a) # 獲取標簽的屬性和屬性值 # print(soup.a.attrs) # bs4的一些函數

# (1)find
# 返回的是第一個符合條件的數據 # print(soup.find('a')) # 根據title的值來找到對應的標簽對象 # print(soup.find('a',title="a2")) # 根據class的值來找到對應的標簽對象 注意的是class需要添加下划線 # print(soup.find('a',class_="a1"))

# (2)find_all 返回的是一個列表 並且返回了所有的a標簽

# print(soup.find_all('a')) # 如果想獲取的是多個標簽的數據 那么需要在find_all的參數中添加的是列表的數據 # print(soup.find_all(['a','span'])) # limit的作用是查找前幾個數據,limit=2前兩個 # print(soup.find_all('li',limit=2))

# (3)select(推薦) # select方法返回的是一個列表 並且會返回多個數據 # print(soup.select('a'))

# 可以通過.代表class 我們把這種操作叫做類選擇器 # print(soup.select('.a1'))

# print(soup.select('#l1'))

# 屬性選擇器---通過屬性來尋找對應的標簽 # 查找到li標簽中有id的標簽 # print(soup.select('li[id]'))

# 查找到li標簽中id為l2的標簽 # print(soup.select('li[id="l2"]'))

# 層級選擇器 # 后代選擇器 # 找到的是div下面的li # print(soup.select('div li'))

# 子代選擇器 # 某標簽的第一級子標簽 # 注意:很多的計算機編程語言中 如果不加空格不會輸出內容 但是在bs4中 不會報錯 會顯示內容 # print(soup.select('div > ul > li'))


# 找到a標簽和li標簽的所有的對象 # print(soup.select('a,li'))

# 節點信息 # 獲取節點內容 # obj = soup.select('#d1')[0] # 如果標簽對象中 只有內容 那么string和get_text()都可以使用 # 如果標簽對象中 除了內容還有標簽 那么string就獲取不到數據 而get_text()是可以獲取數據 # 我們一般情況下 推薦使用get_text() # print(obj.string) # print(obj.get_text())

# 節點的屬性 # obj = soup.select('#p1')[0] # name是標簽的名字 # print(obj.name) # 將屬性值左右一個字典返回 # print(obj.attrs)

# 獲取節點的屬性
obj = soup.select('#p1')[0] print(obj.attrs.get('class')) print(obj.get('class')) print(obj['class'])


免責聲明!

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



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