xpath定位

基本语法

from lxml import etree 如果这种方式报错,使用下面方式导入etree
from lxml.html import etree
tree = etree.HTML(respone)
# 通过标签定位
title_tag = tree.xpath('/html/head/title') # 绝对路径
title_tag = tree.xpath('//title') # 相对路径
title_tag = tree.xpath('//title' | '/html/head/title') # 通过管道符提高定位稳定性,相当于“or”

# 属性定位:根据标签的属性定位标签://tagName[@attrName="attrValue"]
tag = tree.xpath('//div[@class="song"]')#定位class属性值为song的div标签
tag = tree.xpath('//a[@id="feng"]')
tag = tree.xpath('//div[@class="tang"]/ul/li/a[@id="feng"]')

# 索引定位:索引是从1开始的
tag = tree.xpath('//div[@class="tang"]/ul/li[3]')#定位到第三个li标签

'''
获取定位到标签中的文本内容
/text()获取标签中直系的文本内容:返回的列表中只会有一个列表元素
//text()获取标签中所有的文本内容:通常返回列表中存在多个元素
'''
tag = tree.xpath('//div[@class="song"]/p[3]/text()')
tag = tree.xpath('//div[@class="song"]//text()')

# 获取定位到标签中的属性值://tag/@attrName
tag = tree.xpath('//img/@src')

# 注意:xpath表达式中不可以出现tbody标签,如果有直接将其删除跨过即可
# 当标签中出现hidden时,表示该标签会被隐藏,此时该标签无法定位,使用“//”直接跳过,可看最下方实际应用

其他定位方法

<div id='J_cate'>
   <a target="_blank" class="cate_menu_lk" href="Lljiadian.jd.com">家用电器</a>
</div>

tag = etr.xpath('//a[contains(text(),"家用")]')  #包含文本的标签
tag = etr.xpath("//a[@target='_blank' and  @class='cate_menu_lk']")  # 属性组合查询
tag = etr.xpath("//a[contains(@href, 'jd')]")  # 属性模糊查询 
tag = etr.xpath("//a[starts-with(@href, 'Lljiadian.jd')]")  # herf属性以Lljiadian.jd开头的a标签
tag = etr.xpath("//a[contains(@href, 'Lljiadian.jd')]")  # herf属性包含Lljiadian.jd的a标签

利用其兄弟节点或者父节点等各种可以定位的元素进行定位
child  选取当前节点的所有子元素
parent  选取当前节点的父节点
preceding-sibling 选取当前节点之前的所有同级节点
following-sibling 选取当前节点之后的所有同级节点
preceding   选取文档中当前节点的开始标签之前的所有节点
following   选取文档中当前节点的结束标签之后的所有节点

例:tag = etr.xpath("//div[@id='J_cate']/following::a") # 查div节点下的a标签

实际应用

# 代码仅做练习使用,请勿恶意爬取网上资源
# 需求下载前5页图片到指定的目录:https://pic.netbian.com/4kmeinv/

import requests
from lxml.html import etree
import os
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
dir_name = "netJpg"
if not os.path.exists(dir_name):
    os.mkdir(dir_name)
for page in range(1,6):
    if page == 1:
        url ='https://pic.netbian.com/4kmeinv/'
    else:
        url = f"https://pic.netbian.com/4kmeinv/index_{page}.html"
    respone = requests.get(url=url, headers=headers)
    respone.encoding = 'gbk'
    etr = etree.HTML(respone.text)
    li_list = etr.xpath('//div[@class = "slist"]/ul/li')
    for li in li_list:
        jpg_url = "https://pic.netbian.com/"+li.xpath('.//img/@src')[0]
        jpg_name = li.xpath('./a/b/text()')[0]
        jpa_data=requests.get(url=jpg_url,headers=headers).content
        with open(dir_name+"/"+jpg_name+'.jpg','wb') as f :
            f.write(jpa_data)
import requests
from lxml.html import etree
import os
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}
dir_name = "Jpg"
if not os.path.exists(dir_name):
    os.mkdir(dir_name)
url='http://blog.sina.com.cn/lm/pic/'
respone = requests.get(url=url,headers=headers)
respone.encoding='utf-8'
respone = respone.text
tree = etree.HTML(respone)
# 如果按定位的话,实际是//*[@id="pic_wrap0"]/div/div[1]/ul[1],但由于部分div含有hidden,则忽略这个div标签
li_list = tree.xpath('//*[@id="pic_wrap0"]//ul/li')
for li in li_list:
    jag_url = li.xpath('./a//img/@src')[0]
    jag_name = li.xpath('./a//img/@title')[0]
    print(jag_name,jag_url)
    respone_jpg = requests.get(url=jag_url,headers=headers).content
    with open(dir_name+'/'+jag_name+'.jpg','wb') as fb :
        fb.write(respone_jpg)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑*杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值