1. 程式人生 > >python xpath用法

python xpath用法

xpath在Python的爬蟲學習中,起著舉足輕重的地位,對比正則表示式 re兩者可以完成同樣的工作,實現的功能也差不多,但xpath明顯比re具有優勢,在網頁分析上使re退居二線。

xpath的簡單用法:

import requests
# 引入xpath模組
from lxml import etree

url ='http://www.qiushibaike.com/hot/page/1'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'
}
response = requests.get(url,headers=headers)
print(response.content)
# 將字串轉化成html程式碼
root = etree.HTML(response.content)
print(root)
# //從根標籤開始找 找到類名為author clearfix的標籤
# /a 找到某一個標籤下面的a標籤
# text()獲取標籤的文字
name = root.xpath('//div[@class="author clearfix"]/a/h2/text()')
#值是一個列表
print(name)
content = root.xpath('//div[@class="content"]/span/text()')
print(content)

1) // 雙斜槓 定位根節點,會對全文進行掃描,在文件中選取所有符合條件的內容,以列表的形式返回。 

html = etree.parse(原始碼)
print(type(html))
print(html)
# 找到網頁內所有的a標籤
a = html.xpath('//a')
print(a)

# 找到所有的ul標籤
# 找到所有ul當中的所有a標籤
# 獲取a標籤文字和所有a標籤的子標籤的文字
result = html.xpath('//ul//a//text()')
print(result)


2) / 單斜槓 尋找當前標籤路徑的下一層路徑標籤或者對當前路標籤內容進行操作 
3) /text() 獲取當前路徑下的文字內容 

# 找到指定的文字內容
# 如果找某一個標籤的文字 而這個標籤下面還有其他的標籤
# 那麼只找這個標籤的文字 子標籤的文字不找
result = html.xpath('//a/text()')
print(result)

# 獲取指定id名字的標籤的文字
result = html.xpath('//ul/li/a[@id="jd"]/text()')
print(result)
# 獲取擁有指定類名的標籤的文字
result = html.xpath('//a[@class="shopping"]/text()')
print(result)

# //text()找到本標籤以及所有子標籤的文字
result = html.xpath('//div//text()')
print(result)
for name in result:
    print(name)


4) /@xxxx 提取當前路徑下標籤的屬性值 

# 找到所有a標籤的超連結屬性
result = html.xpath('//a/@href')
print(result)

5) last()獲取最後一個

result = html.xpath('//ul/li[last()]')
print(result)

xpath爬蟲例子,爬取天堂圖片網:

# shutil 是高階的檔案,資料夾,壓縮包處理模組
import os,shutil
# urlretrieve 用於圖片的下載
from urllib.request import urlretrieve
import requests
from lxml import etree

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'
}
# 建立資料夾
if os.path.exists('images'):
    shutil.rmtree('images', True)
else:
    os.mkdir('images')
    os.chdir('images')
record = 1
def get_image_with_code(url):
    response = requests.get(url,headers=headers).content
    # print(response)
    code  = etree.HTML(response)
    # 獲取圖片img標籤
    img_list = code.xpath('//div[@class="il_img"]/a/img')
    print(img_list)
    global record
    print('正在下載第{}頁'.format(record))
    os.mkdir('第{}頁'.format(record))
    os.chdir('第{}頁'.format(record))
    for img in img_list:
        # img_src = img.get('src')
        # 獲取圖片地址
        img_src = img.xpath('@src')[0]
        # 獲取圖片名
        img_alt = img.get('alt')+'.jpg'
        print(img_src,img_alt)
        #下載 前面為圖片地址,後面為圖片名字
        urlretrieve(img_src,img_alt)
    record += 1
    # 返回父級目錄
    os.chdir(os.path.pardir)
    # 獲取下一頁的連結
    next_page_url = code.xpath('//a[@class="page-next"]/@href')[0]
    print(next_page_url)
    if len(next_page_url) == 0:
        print('已到最後一頁')
        return
    else:
        base_url = 'http://www.ivsky.com'
        # 拼接網址
        full_url = base_url+next_page_url
        # 呼叫方法獲取下一頁圖片
        get_image_with_code(full_url)
# 呼叫方法開始爬取圖片
get_image_with_code('http://www.ivsky.com/tupian/meishishijie/')