天天看點

爬蟲系列筆記九BeautifulSoup

  1. 基本簡介
    1. BeautifulSoup簡介

      bs4

    2. 什麼是BeautifulSoup?

      BeautifulSoup,和lxml一樣,是一個html的解析器,主要功能也是解析和提取資料

    3. 優缺點

      缺點:效率沒有lxml的效率高

      優點:接口設計人性化,使用友善

  2. 安裝以及建立
    1. 安裝

      pip install bs4

  3. 導入

    from bs4 import BeautifulSoup

  4. 建立對象

    伺服器響應的檔案生成對象

    soup=BeautifulSoup(response.read().decode(),‘lxml’)

    本地檔案生成對象

    soup=BeautifulSoup(open(‘1.html’),‘lxml’)

    注意:預設打開檔案的編碼格式為gbk是以需要指定打開編碼格式

本地練習代碼

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Page Title</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link rel='stylesheet' type='text/css' media='screen' href='main.css'>
    <script src='main.js'></script>
</head>
<body>
    <div>
        <ul>
            <li id="l1">張三</li>
            <li id="l2">李四</li>
            <li>王五</li>
            <a href="" id="" class="a1">張張張</a>
            <span>hhh</span>
        </ul>
    </div>

    <a href="" title="a2">百度</a>
    
    <div id="d1">
        <span>
            hhh
        </span>
    </div>
    <p id="p1" class='p1'>呵呵呵·</p>
    
</body>
</html>
           
from turtle import title
from bs4 import BeautifulSoup

# 通過解析本地檔案 講解bs4的基礎文法

# 加載本地檔案
soup=BeautifulSoup(open('C:/Users/86177/Desktop/tese/python/爬蟲再學/bs4.html',encoding='utf-8'),'lxml')

# 根據标簽名查找節點

print(soup.a)#找到的為第一個符合條件的節點
print(soup.a.attrs)#擷取标簽的屬性和屬性質
print(soup.a.name)#擷取值


# bs4的一些函數
# (1)find傳回第一個符合條件的資料
print(soup.find('a'))
print(soup.find('a',class_='a1'))#可以根據屬性查找對象

# (2)find_all傳回所有符合條件的資料
# 如果想擷取多個标簽的資料 那麼需要在find_all的參數中加的是清單的資料(将所查的參數放入清單中)
print(soup.find_all('a'))
print(soup.find_all(['a','span']))
print(soup.find_all('li',limit=2))#擷取前幾個資料

# (3)select(常用)
# 1. element
#select方法傳回的是一個清單 并且會傳回多個資料
print(soup.select('a'))
#2. .class
    #eg:.firstname
    #可以通過.代表class (稱為類選擇器)
print(soup.select('.a1'))
#3. #id
    #eg:#firstname
    #'#'号代表id
print(soup.select('#l1'))
#4. 屬性選擇器
    #[attribute]
        #eg:li=soup.select('li[class]')
        #查找li标簽中有id的标簽
print(soup.select('li[id]'))
    #[attribute=value]
        #eg:li=soup.select('li[class='hengheng1']')
        #查找到li标簽中id為l2的标簽
print(soup.select('li[id="l2"]'))
#5. 層級選擇器
    #element element
        #div p
        #後代選擇器
        #找到div下面的li
print(soup.select('div li'))
    #element>element
        #div>p
        #子代選擇器
print(soup.select('div > ul > li'))#在bs4中不加空格也可以查到資料,有些不加空格查不到資料
    #element,element
        #div,p
            #eg:soup=soup.select('a,span')
            #找到a标簽和li标簽的所有對象
print(soup.select('a,li'))
# 4.節點資訊
# (1)擷取節點的内容:适用于标簽中嵌套标簽的結構
	# obj.string
	# obj.get_text()
# 兩者的差別:如果對象中隻有内容 兩者都可以擷取到,如果對象中既有内容也有标簽這時隻有get_text可以擷取到資料,string不能

# 擷取節點資訊
obj=soup.select('#d1')[0]

print(obj.string)
print(obj.get_text())

# (2)節點的屬性
# tag.name 擷取标簽名
#eg:
tag=soup.find('li')
print(tag.name)
tag.attrs将屬性值作為一個字典傳回
obj=soup.select('#p1')[0]
print(obj)
print(obj.name)#name為标簽的名字
# #将屬性名作為一個字典傳回
print(obj.attrs)

# (3)擷取節點屬性
obj.attrs.get('title')
obj.get('title')
obj['title']
# 擷取節點的屬性
obj=soup.select('#p1')[0]
print(obj.attrs.get('class'))
print(obj.get('class'))
           
爬蟲系列筆記九BeautifulSoup

bs4實踐小實驗《爬取星巴克菜單資料》

import urllib.request
from bs4 import BeautifulSoup

url='https://www.starbucks.com.cn/menu/'

response=urllib.request.urlopen(url)

content=response.read().decode('utf-8')

# print(content)

soup=BeautifulSoup(content,'lxml')

name_list=soup.select('ul[class="grid padded-3 product"] strong')
for i in name_list:
    print(i.string)
           
爬蟲系列筆記九BeautifulSoup