问题解决
如何从文本和标记同级混排的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
网友评论