个人小程序当前具备了:各地实时多日天气预报查询、日历农历黄历万年历、密码记账本、理财计算器带历史数学计算器、出行路线查询等功能,扫描二维码体验:
就是当前集中功能太多速度很慢,回头还要有优化。。。
微信小程序系列文章列表:
一文读懂微信小程序开发工具、项目结构、全局配置文件及页面跳转
一文读懂微信小程序开发wxml、json、js、wxss四类核心文件
微信小程序开发抽取HTML种数据的最快方法是正则表达式,而不是循环
上一篇介绍了微信小程序开发中不可不知的WXML、WXSS、JSON、JS四类主要文件。其中提到了JS文件中有一个变量,名叫正则。
做项目的过程中,刚好用到这个变量,因为用微信小程序获取了网页源数据,但是是一堆HTML文档代码,若用循环来处理抽取里面我想要的信息,太过于复杂,所以着手用正则表达式来做。
方法如下:
一、从网页上获取源数据(HTML文档)
在js文件中,关键代码如下:
Page({
data: {
csdn: {}//用于存储获取的html文档
},
首先设置你想获取信息的网址
var url = 'https://blog.csdn.net';
然后用 wx.request这个接口来访问该网址,并获取网页源代码
wx.request({
url: url,
data: {
},
method: 'GET',//get是从服务器上获取数据,post是向服务器传送数据。浏览器用GET请求来获取一个html页面/图片/css/js等资源;用POST来提交一个<form>表单,并得到一个结果的网页
success: function (res) {
that.setData({ csdn: res.data)});
},
})
})
用这种方法得到的变量csdn值如下,由于数据量太大,只截取了部分代码
ic/common/toolbar/js/m_toolbar-1.1.1.js" id="m-toolbar-tpl-scriptId" prod="blog">
width:0; height:0; visibility:hidden; position: absolute;display: none">
" points=" 41.8,34 41.8,56 38.2,56 38.2,34 28.5,43.2 24,43.2 40,28.1 56,43.2 51.5,43.2 "/>
" viewBox=" 0 0 1024 1024">
" p-id=" 9079" fill="#cccccc"/>
" viewBox=" 0 0 80 80">
" cx=" 40" cy="40" r="40"/> " y=" 24" class="st1" width="32" height="3.5"/> overflow:visible;fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;"/>
</symbol>
</svg> <nav class="d-flex">
<div class="nav-mask">
<div class="warp">
<a class="btn-nav" onclick="changeNav($(this))" data-href="/" data-category="home">博客推荐</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/watchers" data-category="watchers">动态</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/career" data-category="career">程序人生</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/python" data-category="python">Python</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/java" data-category="java">Java</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/ai" data-category="ai">百万人学AI</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/web" data-category="web">前端</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/arch" data-category="arch">架构</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/blockchain" data-category="blockchain">区块链</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/db" data-category="db">数据库</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/5g" data-category="5g">5G</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/game" data-category="game">游戏开发</a>
<a class="btn-nav" onclick="changeNav($(this))" data-href="/nav/mobile" data-category="m
二、用正则表达式匹配想要的信息
1.什么是正则表达式
说白了就是一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
2.正则表达式常用语法
(1)/表示正则表达式的开始与结束
(2)++号代表前面的字符必须至少出现一次(1次或多次)
例如:runoo+b,可以匹配 runoob、runooob、runoooooob 等。
(3)*表示字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
例如:runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表
(4)? 问号代表前面的字符最多只可以出现一次(0次、或1次)
colou?r 可以匹配 color 或者 colour。
(5)\s匹配任何空白字符,包括空格、制表符、换页符等等。
(6)\S匹配任何非空白字符。
(7)[标记一个中括号表达式的开始。要匹配 [,请使用 \[。
(8)() 括号里面是组, 可以提取组内的内容
(9)[\s\S]*?
是完全通配的意思; “[ ]”是范围描述符。 \s是指空白,包括空格、换行、tab缩进等所有的空白,而\S刚好相反,这样一正一反下来,就表示所有的字符,完全的,一字不漏的。 例如:
<span id="ctext">([\s\S]*?)</span> 意思就是匹配所有在两个<span>中间有0个或多个任意字符的字符串. 并把内容部分生成个组
更多的语法可以查询菜鸟教程https://www.runoob.com/regexp/regexp-syntax.html
3.写出正则表达式
下面列举出我在项目中常用到的一种
let my_reg =/<td class='colorize'>([\s\S]*?)<\/td>/gmi;
这是抓取网页HTML信息种最常用的一种写法,直接用标签+全匹配,
则下面这句HTML标签内容中的“被抓内容”就会被匹配出来。
...
<td class='colorize'>被抓内容</td>
...
后面的参数如下
4.抽取数据------.exec()函数
在微信小程序中通过以下**.exec()函数**进行匹配,将结果放入数组
data_we_want = my_reg.exec(page)
关于返回值数组data_we_want :
除了数组元素和 length 属性之外,exec() 方法还返回两个属性:
5.全局循环抽取
用这种方面你会发现,虽然配置了全局匹配,也就是加了参数gmi,但是有可能只匹配了一次,也就是返回值数组中只有一个元素,后续就不匹配了,原因是还要再加循环才行。方法如下:
var data=[];
while ((tmp_reg = my_reg.exec(page)) != null) {
data.push(util.regular(tmp_reg[1]));
}
这种方法会将page页面中的所有元素匹配一遍,但有时你会发现第一个元素老是匹配不到,这是因为.lastIndex 参数刚开始不为零。
这个参数代表以为指针位置,每次都从这个位置开始匹配,所以刚开始需要清零。
优化后,代码如下:
var data=[];
my_reg.lastIndex = 0;
while ((tmp_reg = my_reg.exec(page)) != null) {
data.push(util.regular(tmp_reg[1]));
}
在while循环内部lastIndex 并没有清零,所以每循环一次拿出一个匹配数组,我们只要第1个元素tmp_reg[1],这是我们匹配到的文本,然后下一次循环匹配会按照lastIndex的位置继续往后匹配。
三、几种常用正则表达式示例
var names = /^[\u4E00-\u9FA5A-Za-z]+$/; //姓名
var phonetel = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\d{8})$/; //手机号
var emailnums = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*.[a-zA-Z0-9]{2,6}$/; //邮箱
var idCard = /(\d{15}$)|(^\d{18}$)|(\d{17}(\d|X|x)$)/; //身份证