Xpath-Jquery-Regx-GetSubNode

问题解决

如何从文本和标记同级混排的html代码中提取数据?
比如下面这种情况:

<p>苏州 <em class="vline"/>5-10年<em class="vline"/>本科</p>

如何用xpath一次取到【本科】?
正确的方法是使用/node()[3]方法,比如

//*[@class='info-primary']//p//node()[3]

然后nodes.toString()就能得到【本科】数据。

常见的其他xpath语法:
//双杠表示层级跳跃获取,比如/div//span表示这个span在div下面,但不一定是紧挨的父子关系,也可能是爷孙关系。
//[@attr='a']表示属性attr为a的任意元素,这里attr可以是id,class或其他。
//
[contains(class,'cc')]表示class包含cc的元素
//div[2]表示第二个

Jquery和xpath的不同

对于下面这个结构

    <div>
        <li>
            <ul>
                <p>王小明</p>
                <div><span>年龄</span><span>12</span></div>
            </ul>
            <ul>
                <p>刘晓明</p>
                <div><span>年龄</span><span>13</span></div>
            </ul>
            <ul>
                <p>吴文英</p>
                <div><span>年龄</span><span>14</span></div>
            </ul>
        </li>
    </div>

如果想要取得三个名字中的任意一个是很容易的$('div li ul p:eq(2)')或者/div/li/ul/p[2]都可以。
但是如果要取到三个年龄数字就不一样了。
$('div li ul div span:eq(1)取到的是12,这是因为jquery把六个span(三个年龄,三个数字)放在一起考虑,然后得到第二个。
而xpath则不同,/div/li/ul/div/span[2]得到的是3个数字元素组成的数组,而不是一个数字。

正则表达式

提取字符串部分数据,js中提供string.match(regx)方法。但是总会把正则里面的内容也包含在提取结果中,比如'abcd'.match(/.bc./)得到abcd而不是bc.

如何让表达式中的字符参与匹配但不被提取?

可以参照正则表达式的前瞻和后顾方法改进,后顾就是考虑后面有什么,但不会把后顾内容取出。但前瞻仍然会包含取出来...

比如/>.{1,5}(?=</p>)取出来的总是会包含前面的/>而不包含后面的</p>,结果类似/>苏州这个样子。暂时不知道有没有更好的办法。


致力于让一切变得简单

如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~


END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。