xpath用法(非常实用)和示例

安装 cmd 里  pip install lxml
导入 from lxml import etree

作者学爬虫的课:https://www.bilibili.com/video/av33963847,不是广告,老师讲的特别好
'''
再x-path中,有3种主要类型的节点:元素,属性,文本
常用的路径表达式:
//:不考虑位置的查找
./:从当前节点开始往下查找
..:从当前节点的父节点查找
@:选取属性
示例:
/bookstore/book   选取根节点bookstore子节点book 
//book            选取所有book
/bookstore//book   选取bookstore下面所有的book
/bookstore/book[1]  选取bookstore第一个book 
/bookstore/book[last()]  倒数第一个
/bookstore/book[last()-1]  倒数第二个
/bookstore/book[position()<3]  前2个book
//title[@lang]   选取所有带有lang属性的title
//title[@lang='eng'] 选取所有带有lang属性值为eng的title
*   任何元素节点
/bookstore/*   选取节点bookstore所有子节点
//*             选取文档中的所有元素
//title[@*]     选取所有带有属性的title元素


安装xpath插件      下载解压   打开快捷键ctrl + shift + x  
      
属性定位://input[@id="kw"]   //input[@class="bg s_btn"]class有多少写多少
层级定位://div[@id='ftCon']/div[1]//a[@id='setf']
逻辑运算定位(and)://input[@id="kw" and @name="wd"] 
模糊匹配:contains://input[contains(@class,"s_t"] 
          starts-with://input[starts-with(@class,"s_t"]
取文本text()方法:1//p[@id='lh']/a[4]/text()  获取节点内容
                 2 //p[@id='lh']//text()   不戴标签的所有内容
                 3 string显示的是连起来的字符串内容,但是string是一个对象,但是可以用字符串方法
                    string = ret[0].xpath('string(.)')   
                    print(string.replace('\n','').replace('\t',''))  #拼接
取属性://p[@id='lh']/a[4]/@href    找a下的href属性
        [@class="box picblock col3 masonry-brick"]/div/a/img/@src  img里的href属性

xpath插件使用时1开始,代码中是0开始
'''
#使用:将html文档变成一个对象,然后调用对象的方法取查找指定的节点

from lxml import etree
#本地文件 tree = html.etree.parse(文件名)
tree = etree.parse('阜阳师范学院_1.html')
ret = tree.xpath('//div[class="search_top clearfix"]/div/a[2]/@href')
#ret是一个列表
print(ret)
#string显示的是连起来的字符串内容,但是string是一个对象,但是可以用字符串方法
string = ret[0].xpath('string(.)')
print(string.replace('\n','').replace('\t',''))
#网络文件tree = etree.HTML(网页字符串)
# tree = etree.HTML()

chrome里拓展程序把xpath安装包放入即可

安装包:链接:https://pan.baidu.com/s/1T2tp77SJceb-AIWCY2cjOw 
              提取码:0vsn 

 

实例:爬取http://sc.chinaz.com/图片

import urllib.request
import urllib.parse
from lxml import etree
import os
import time

def handle_request(url,page):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36"
    }
    #由于第一页和后面的页码规律不一样,所以进行判断
    if page == 1:
        url = url.format('')
    else :
        url = url.format('_' + str(page))
    request = urllib.request.Request(url=url,headers=headers)
    return request

def download_image(image_src):
    dirpath = 'xuejing'
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)
    #搞个文件名
    filename = os.path.basename(image_src)
    #图片路径,用os.path.join拼接一下
    filepath = os.path.join(dirpath,filename)
    #发送请求,保存图片
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36"
    }
    request = urllib.request.Request(url=image_src,headers=headers)
    response = urllib.request.urlopen(request)
    with open(filepath,'wb') as f:
        f.write(response.read())
def parse_content(content):
    tree = etree.HTML(content)
    #第一页://div[@id="container"]/div/div/a/img/@src
    #懒加载技术:用到的时候在加载,滑动的时候再加载
    image_list = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')
    #下载图片,遍历列表
    for image_src in image_list:
        download_image(image_src)


def main():
    start = int(input("请输入起始页码:"))
    end = int(input("请输入结束页码:"))
    url = 'http://sc.chinaz.com/tupian/bingxueshijie{}.html'
    for page in range(start,end+1):
        request= handle_request(url,page)
        content = urllib.request.urlopen(request).read().decode()
        parse_content(content)
        time.sleep(2)

if __name__ == '__main__':
    main()

我是爬取了一到3页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值