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/')