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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章