【文档解析插件】xml,html,json,字典,字符串处理工具。配合Http采集数据

瞌睡蟲子 8月前 2662

说明:

该插件封装了jsonpath,xpath,cssquery模块,用于html,json格式文档解析。另外提供了一个正则表达式处理文本工具,和python表达式执行工具。


插件安装:

将附件《domtools插件.rar》解压缩到UB的安装目录即可,注意不是UB根目录下面


使用方法:

提供两个方法:先加载识别库,再识别图片。

注意:这里有魔鬼pyeval

{
	"CSS" : 
	{
		"Description" : html cssquery选择器,
		"TranslateTemplate" : 执行%1%选择器,如果%2%存在。否则从全局initDom中查找
	},
	"Description" : null,
	"INITDOM" : 
	{
		"Description" : 初始化全局dom,
		"TranslateTemplate" : html源码:%1%
	},
	"INITJSON" : 
	{
		"Description" : 初始化全局json,
		"TranslateTemplate" : json源码或者字典对象:%1%
	},
	"JPATH" : 
	{
		"Description" : jsonpath选择器,
		"TranslateTemplate" : 执行%1%选择器,如果%2%存在。否则从全局initjson中查找
	},
	"PYEVAL" : 
	{
		"Description" : 执行python表达式(这是魔鬼,小心使用),
		"TranslateTemplate" : 表达式%1%,参数%2%。表达中可以用args取到传递的参数
	},
	"REPLACE" : 
	{
		"Description" : 正则替换,
		"TranslateTemplate" : 正则表达式:%1%,替换后表达式:%2%,查找的字符串:%3%
	},
	"XPATH" : 
	{
		"Description" : xpath选择器,
		"TranslateTemplate" : 执行%1%选择器,如果%2%存在。否则从全局initDom中查找
	}
}

实例:

import domtools
Import Http
Import Regex
dim html = ""
// 下载一个html源文件
html = Http.Get("https://forum.uibot.com.cn/thread-263.htm", {}, 60000)
// 构建全局dom,之后的css,xpath在不指定文档时,默认从全局dom执行查找
domtools.initDom(html)
Dim a
// 结构化实例
TracePrint({"title":domtools.xpath("//li/a")[1],"body":domtools.xpath("//li/a/text()")[1],"url":domtools.xpath("//li/a/@href")[1]})
// cssquery选择器,查找li元素下面部分层级的a元素。结果返回一个一维数组
a = domtools.css("li a")
// xpath选择器,页面中所有链接的链接地址。没有自动补齐
TracePrint(domtools.xpath("//li/a/@href"))
TracePrint(a)
TracePrint(a[1])
// 局部文档查找
TracePrint(domtools.xpath("//li/p","<ul><li>123</li><li>cdf<p class='ddd'>sasdf</p></li></ul>"))
TracePrint(domtools.xpath("//li/p/@class","<ul><li>123</li><li>cdf<p class='ddd'>sasdf</p></li></ul>"))
TracePrint(domtools.xpath("//li/p/text()","<ul><li>123</li><li>cdf<p class='ddd'>sasdf</p></li></ul>"))
// 下载一个json文件
dim jsn = {"a":"123","b":123,"c":"啊哈","d":{"e":"aa"},"f":[{"a":"ad"},{"g":"df","m":"dfd"}]}
TracePrint(jsn)
// 构建全局json,json字符串或者字典。之后的jpath在不指定文档时,默认从全局json执行查找
domtools.initJson(jsn)
// 全局查找所有的f节点
TracePrint(domtools.jpath("$..f"))
// 全局查找所有f为array的节点的第1个字典的a节点的值(真tm绕口)
TracePrint(domtools.jpath("$..f[0].a"))
// 局部json文档查找
TracePrint(domtools.jpath("$..f","{\"a\":1,\"f\":2}"))
// 再次重生这是魔鬼、魔鬼、魔鬼。可以用python的语法糖和特性,安全不保证.args为第二个参数名。可以在表达式中调用。
TracePrint(domtools.pyeval("[item+'aa' for item in args]", ["a","b","c"]))
TracePrint(domtools.pyeval("' '.join(args)",  ["Hello","world","!","魔","鬼","来","啦"]))
TracePrint(domtools.pyeval("args[0]['a']", domtools.jpath("$..f[*]")))
Dim url = "https://113.215.20.136:9011/113.215.6.77/c3pr90ntcya0/youku/6981496DC9913B8321BFE4A4E73/0300010E0C51F10D86F80703BAF2B1ADC67C80-E0F6-4FF8-B570-7DC5603F9F40.flv"
// 基于正则提取货替换的一表达式方法。做爬虫习惯这种集提取、替换、格式化于一体的方法。当然不要想着别人能看懂你的代码
TracePrint(domtools.replace("(?<![\\.\\d])(?:\\d{1,3}\\.){3}\\d{1,3}(?![\\.\\d])", "lambda x: x.group(0)+'aaaa'", url))

运行效果:

_【文档解析插件】xml,html,json,字典,字符串处理工具。配合Http采集数据


后记:

     这里直接上简单的的实例,实际采集中,完全可以将结果直接序列化为一个json表达式结构。另外正则replace和pyeval有很多妙用,自己去发现

向这样:

{"title":domtools.xpath("//li/a")[1],"body":domtools.xpath("//li/a/text()")[1],"url":domtools.xpath("//li/a/@href")[1]}


上传的附件:
最新回复 (18)
  • 九木成林 8月前
    2
    阔以写爬虫了 牛逼
  • MAKI 8月前
    3
    仰慕大神,学习了
  • 夜行 8月前
    4



    上面出错是什么原因啊


  • 哒哒 8月前
    5
    。。。。。。。MMP,看不懂的1024
  • 瞌睡蟲子 8月前
    6
    夜行 上面出错是什么原因啊
    你装了插件么
  • 何_36095 5月前
    7
    大神你提供的三个插件下载不了呀
  • 瞌睡蟲子 5月前
    8
    何_36095 大神你提供的三个插件下载不了呀
    哪三个插件?
  • tsuki 3月前
    9
    列子写的很好,简单易懂,非常感谢。
    请问有没有domtools插件的函数说明文档???
    我现在只知道列子中提到的几个函数用法,有没有没有在例子中出现的?
  • 瞌睡蟲子 3月前
    10
    tsuki 列子写的很好,简单易懂,非常感谢。 请问有没有domtools插件的函数说明文档??? 我现在只知道列子中提到的几个函数用法,有没有没有在例子中出现的?
    抽时间我整个帮助文档,之前都直接使用插件info简单描述下。
  • tsuki 3月前
    11

    https://forum.uibot.com.cn/thread-1347.htm

    楼主能帮忙看下这个问题吗?谢谢

  • 瞌睡蟲子 3月前
    12
    tsuki https://forum.uibot.com.cn/thread-1347.htm楼主能帮忙看下这个问题吗?谢谢
    回复了,这个不是插件问题哈。
  • 刘先生_51735 3月前
    13
    domtools怎么才能生效??

  • 瞌睡蟲子 3月前
    14
    刘先生_51735 domtools怎么才能生效??
    看插件说明,安装好就行了
  • 没有P的PM 3月前
    15
    瞌睡蟲子 看插件说明,安装好就行了


    老师你好,烦请解惑,我在Console中是可以找到这个元素的,但是我从代码里使用插件就一直报""


     

     这个是console中的结果


    上述为输出结果,烦请老师解惑,是我插件装的不对吗?如果不对装完插件该如何判断是否已安装,有没有命令之类的,如果不是那是什么原因呢?


  • 瞌睡蟲子 3月前
    16
    你是用的http获取网页,还是用的浏览器获取网页?浏览器有一个渲染的过程,会把html解析执行。并加载动态数据,而http是获取的是原始的html文件,没有渲染的,动态数据不会加载。所以你找不到应该是没加载动态数据
  • 没有P的PM 3月前
    17
    瞌睡蟲子 你是用的http获取网页,还是用的浏览器获取网页?浏览器有一个渲染的过程,会把html解析执行。并加载动态数据,而http是获取的是原始的html文件,没有渲染的,动态数据不会加载。所以你找不到应该是 ...
    那这种动态写入的数据中的元素我该如何获得呢?老师有没有其他的办法?我用“数据抓取”功能获取不到我想要的那个a标签。
  • 瞌睡蟲子 3月前
    18
    没有P的PM 那这种动态写入的数据中的元素我该如何获得呢?老师有没有其他的办法?我用“数据抓取”功能获取不到我想要的那个a标签。
    有多种方法,获取元素属性,获取元素文本,最后是执行js脚本
    基本上执行js脚本都可以获取到
  • 朕_28960 5天前
    19
    document.getElementsByClassName("part")[0].getElementsByTagName("op")[0].getElementsByClassName("anm")[0].textContent
返回
发新帖