1. 程式人生 > 實用技巧 >爬蟲-beautifulsoup的使用(5)

爬蟲-beautifulsoup的使用(5)

資料準備:

from bs4 import BeautifulSoup

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bobby基本資訊</title>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
    <div id="info">
        <p style="color: blue">講師資訊</p>
        <div class="teacher_info info">
            python全棧工程師,7年工作經驗,喜歡鑽研python技術,對爬蟲、
            web開發以及機器學習有濃厚的興趣,關注前沿技術以及發展趨勢。
            <p class="age">年齡: 29</p>
            <p class="name bobbyname" data-bind="bobby bobby2">姓名: bobby</p>
            <p class="work_years">工作年限: 7年</p>
            <p class="position">職位: python開發工程師</p>
        </div>
        <p style="color: aquamarine">課程資訊</p>
        <table class="courses">
          <tr>
            <th>課程名</th>
            <th>講師</th>
            <th>地址</th>
          </tr>
          <tr>
            <td>django打造線上教育</td>
            <td>bobby</td>
            <td><a href="https://coding.imooc.com/class/78.html">訪問</a></td>
          </tr>
          <tr>
            <td>python高階程式設計</td>
            <td>bobby</td>
            <td><a href="https://coding.imooc.com/class/200.html">訪問</a></td>
          </tr>
          <tr>
            <td>scrapy分散式爬蟲</td>
            <td>bobby</td>
            <td><a href="https://coding.imooc.com/class/92.html">訪問</a></td>
          </tr>
          <tr>
            <td>django rest framework打造生鮮電商</td>
            <td>bobby</td>
            <td><a href="https://coding.imooc.com/class/131.html">訪問</a></td>
          </tr>
          <tr>
            <td>tornado從入門到精通</td>
            <td>bobby</td>
            <td><a href="https://coding.imooc.com/class/290.html">訪問</a></td>
          </tr>
        </table>
    </div>

</body>
</html>

"""

資料處理

獲取標籤
# bs = BeautifulSoup(html, "html.parser")
# title_tag = bs.title
# print(title_tag.string)
# 以字串的形式輸出
# div_tag = bs.div
# 僅僅獲取到第一個div
# print(div_tag.string)

#find的查詢實現方式,查詢單個, # div_tag = bs.find("div") # div_tag = bs.find(id="info-955") # div_tag = bs.find("div", id="info-955") #如果匹配更多可以使用findall
# div_tags = bs.find_all("div") # for tag in div_tags: # print(tag.string)

import re #使用正則表示式的實現 # div_tag = bs.find("div", id=re.compile("info-\d+")) # 也可以使用內容匹配 # div_tag = bs.find(string="bobby") #

根據html的dom形式獲取父類,子類的資料的處理方式

# 
# 獲取子元素的子元素
# childrens = div_tag.descendants
# for child in childrens:
# if child.name: # print(child.name) # # 父元素的所有父元素 # parents = bs.find("p",{"class":"name"}).parents # for parent in parents: # print(parent.name) #獲取兄弟節點 # previous_sibling = bs.find("p",{"class":"name"}).previous_sibling # print(previous_sibling.string) # for sibling in previous_siblings: # print(sibling.string)

獲取屬性的方式:

# 獲取屬性的方式
# name_tag = bs.find("p",{"class":"name"})
# class支援多值屬性,返回的是一個列表
# print(name_tag["class"])
# print(name_tag.get("class"))
# 自定義的屬性,返回的值是字串
# print(name_tag["data-bind"])

缺點:學習成本高,一旦換庫將意味著重新學習

優點:安裝簡單,學習難度較低