1. 程式人生 > >python爬蟲-beautifulsoup匹配

python爬蟲-beautifulsoup匹配

一、beautifulsoup匹配 

BeautifulSoup是Python的一個庫,最主要的功能就是從網頁匹配我們需要的資料。

BeautifulSoup將html解析為物件進行處理,全部頁面轉變為字典或者陣列,相對於正則表示式的方式,可以大大簡化處理過程。

安裝:pip3 install beautifulsoup4

Beautifulsoup和xpath的使用結構大同小異

 1.beautifulsoup匹配步驟 

匯入模組:from bs4 import BeautifulSoup

(1)構建beautifulsoup例項

# coding:utf-8
import requests
from bs4 import BeautifulSoup

html = '''
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <div>
           <ul>
             <li name="suner" class="one"><a>suner</a></li>
             <li name="wjk" class="two">wjk</li>
           <li name="wang" class="three">wang</li>
           <li name="karry" class="four">karry</li>
           </ul>
        </div>
    </body>
</html>
'''
soup = BeautifulSoup(html,"lxml")

① 第一個引數是要匹配的內容
② 第二個引數是beautifulsoup要採用的模組
     # html.parser  Python內建的結構匹配方法,但是效率不如lxml所以不常用
     # lxml 使用 lxml模組
     # xml 使用 xml模組
     # html5lib  該模組可以將內容轉換HTML5物件
     # 但是我們要想用以上功能就要具備對應模組,比如你用lxml就要安裝lxml

(2)查詢元素的值

在bs4當中有n多種匹配方法,但是最常用的是兩種

▲ find 查詢一次

① find查詢

soup = BeautifulSoup(html,"lxml")
# 查詢第一個li元素的值
li_one = soup.find("li")
print(li_one)
print(li_one.text)
print(li_one.attrs)
<li class="one" name="suner"><a>suner</a></li>
suner
{'class': ['one'], 'name': 'suner'}

② 通過屬性值查詢

soup = BeautifulSoup(html,"lxml")
# find 可以通過屬性=值的方法進行select
# class 屬性匹配要加上下劃線
li = soup.find(class_="two")
print(li)
<li class="two" name="wjk">wjk</li>

③ select查詢

soup = BeautifulSoup(html,"lxml")
# 在進行層級查詢我們可以用select
li_one = soup.select("li a")
print(li_one)

[<a>suner</a>]

④ findall 查詢所有

soup = BeautifulSoup(html,"lxml")
# 查詢所有li元素的值
li_list = soup.find_all("li")
for li in li_list:
    print("----------------------")
    print(li)
    print(li.text)
    print(li.attrs)
----------------------
<li class="one" name="suner"><a>suner</a></li>
suner
{'class': ['one'], 'name': 'suner'}
----------------------
<li class="two" name="wjk">wjk</li>
wjk
{'class': ['two'], 'name': 'wjk'}
----------------------
<li class="three" name="wang">wang</li>
wang
{'class': ['three'], 'name': 'wang'}
----------------------
<li class="four" name="karry">karry</li>
karry
{'class': ['four'], 'name': 'karry'}

⑤ soup本身返回

soup = BeautifulSoup(html,"lxml")
print("--------------")
print(soup.title)
print("--------------")
print(soup.head)
print("--------------")
print(soup.li)
--------------
<title>test</title>
--------------
<head>
<title>test</title>
</head>
--------------
<li class="one" name="suner"><a>suner</a></li>