吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4145|回复: 28
收起左侧

[其他转载] xpath终结者:xpath-helper-plus

  [复制链接]
miboy 发表于 2022-7-6 16:15
本帖最后由 miboy 于 2022-7-6 16:17 编辑

前言

作为一个资深『xpath』提取工程师,想要快速从页面中拿到数据,肯定需要借助一些工具,
而最初接触的就是xpath-helper这块浏览器插件。使用一段时间后,发现笔者有一些特别的需求,想在此基础上扩展一下。
于是乎就学习了如何开发chrome插件?如何使用自己属性的vue来开发?经过双休一顿文档、gayhub了解之后,有了这样一款工具。

问题

xpath-helper2.0.2原生是支持按住shift后通过鼠标来定位选择元素,并输出xpath语法,但是这种方式出来的xptah语法并不友好。

比如说我想拾取掘金的某个文章标题:

/html/body/div[@id='nuxt']/div[@id='layout']/div[@id='juejin']/div[@class='view-container container']/main[@class='container main-container with-view-nav']/div[@class='view timeline-index-view']/div[@class='timeline-container']/div[@class='timeline-content']/aside[@class='index-aside aside']/div[@class='signin-tip signin']/div[@class='first-line']/button[@class='btn signin-btn']/span[@class='btn-text']

它出来了一个xpath语法,这个xpath语法是从DOM根节点开始逐一向下(源码是从下至上)来拼接的。这样就会变成十分地冗余。
虽然它的确能够精准定位到我们想要的元素,但是一旦把这样的xpath语法复制到代码里,是十分可怕的。

当然还有一部分程序员热衷于选择使用chrome原生的元素复制成xpath。

出来的结果是:

//*[@id="juejin"]/div[1]/main/div/div/div/aside/div[1]/div[1]/button/span

显然以上两种方案都有其问题:语法冗余、毫无可读性。

解决

笔者给出的解决方案是在xpath-helper基础上,增加一个辅助功能,它可以最大化精简xpath语法,一旦发现其语法能够识别到该元素就不再继续往上查找。而是立刻返回。

//span[@class='btn-text']

并且它也可以友好的转为css选择器语法:

span.btn-text

我们可以在chrome的元素中检查这个语法:

  • xpath:
  • css:

实现

xpath-helper-plus其核心API均来自于xpath-helper。

笔者在此基础上增加了一些额外的功能,比如:精简xpath语句、转化CSS选择器。

与原有的xpath helper不同的是,这次chrome插件采用Vue3+vite来开发,面向组件,通过vite打包成chrome插件规范的文件目录结构。
未来可能会提供更多的功能。或者在此基础上开发其他插件。

开源

https://github.com/mic1on/xpath-helper-plus



如果你无法访问GitHub,提供给你离线的chrome插件安装包。
dist.zip (75.72 KB, 下载次数: 191)

免费评分

参与人数 12吾爱币 +24 热心值 +12 收起 理由
铁板铜锣烧 + 2 + 1 用心讨论,共获提升!
行走的码农 + 1 热心回复!
蓝风 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
撸冰花 + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
love008 + 1 + 1 谢谢@Thanks!
ytw6176 + 2 + 1 谢谢@Thanks!
E式丶男孩 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dreamer2012 + 1 + 1 谢谢@Thanks!
正己 + 4 + 1 xpath党狂喜
只有午安 + 2 + 1 用心讨论,共获提升!
qazmc1314 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

  • · Aarow|主题: 991, 订阅: 304
  • · 好帖|主题: 540, 订阅: 84

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

liesauer 发表于 2022-7-7 09:42
getstr88 发表于 2022-7-6 22:44
有点没理解。chrome中xpath的输出,如果能通过class id等唯一标识的,它也会从那里开始写。除非是没有的, ...

这个所谓的精简是有问题的,浏览器生成的路径肯定是唯一的,虽然长了点,但是总能给你找对(结构不变的情况下,不包含列表式增删),这是很稳定的行为。
但是楼主所谓的精简,用楼主提到的“//span[@class='btn-text']”举例,我一开始拿到的html当时可能只有一个span用到了这个类,然后给精简了最简的样子,但是网页内容要是动态滚动加载的,后面一加载新内容,又多了几个span,此时“//span[@class='btn-text']”就会匹配到多个。
大勹 发表于 2022-9-7 18:57
非常非常的 nice

就是有个疑问,在 dev 运行的时候,访问显示的访问地址,去访问的时候,会出现 这样的错误,
问题是怎么才能向网页一样,实时的热更新呢,感谢楼主大大
        
Uncaught TypeError: Cannot read properties of undefined (reading 'query')    utils.ts:3
    at sendMessageToContentScript (utils.ts:3:17)
    at watch.immediate (home.vue:15:3)
    at callWithErrorHandling (runtime-core.esm-bundler.js:155:22)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:164:21)
    at job (runtime-core.esm-bundler.js:1782:17)
    at doWatch (runtime-core.esm-bundler.js:1818:13)
    at watch (runtime-core.esm-bundler.js:1668:12)
    at setup (home.vue:13:1)
    at callWithErrorHandling (runtime-core.esm-bundler.js:155:22)
    at setupStatefulComponent (runtime-core.esm-bundler.js:7165:29)
sam喵喵 发表于 2022-7-6 16:23
感谢分享,期待更强大工具出现~

点评

厉害厉害,虽然用不到  发表于 2022-7-6 17:55
Xw丶小威 发表于 2022-7-6 17:39
可以的。方便很多。
kiopc 发表于 2022-7-6 19:12
不错,对爬虫来说很友好!
精简xpath语句是怎么实现的?思想是啥啊?
萌新与小白 发表于 2022-7-6 20:21
还有一个插件SelectorsHub,也可以测试xpath
E式丶男孩 发表于 2022-7-6 21:48
这东西挺好的啊
likoaong 发表于 2022-7-6 22:17
mac字体好看啊
不苦小和尚 发表于 2022-7-6 22:20
楼主,插件安装不了什么原因
不苦小和尚 发表于 2022-7-6 22:23
不苦小和尚 发表于 2022-7-6 22:20
楼主,插件安装不了什么原因


Invalid value for 'web_accessible_resources[0]'.
无法加载清单。
 楼主| miboy 发表于 2022-7-6 22:33
不苦小和尚 发表于 2022-7-6 22:23
Invalid value for 'web_accessible_resources[0]'.
无法加载清单。

1是否已经在扩展中心-加载扩展文件夹
2加载后浏览器应该会出现插件logo
3打开百度后点开插件测试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 21:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表