请问一个关于eweb4j的问题

xiangfang 发布于 2015/04/16 19:11
阅读 84
收藏 0

@自风 你好,请教一个问题eweb4j下org.eweb4j.util.xml.Tags.java这个类中的cleanXmlTags方法中有如下一段代码

for (String delTag : delTags){

List<String> tag = findByRegex(xml, xmlTagsRegex(delTag));
if (tag == null || tag.isEmpty() || tag.size() != 2)
continue;
String regex = resolveRegex(tag.get(0)) + ".*" + resolveRegex(tag.get(1));
xml = xml.replaceAll(regex, "");
}


tag.size() != 2

是起什么作用的呢?

需要对采集到的文本中的标签做更多处理时就有问题,如下:

一段Html:

<a>你好</a><script/><script/><script></script><img/><ul></ul>

spiderman配置文件XML中<parser exp="$Tags.xml($this).rm('script').rm('ul').empty().ok()" />对采集到的HTML的处理时,有较多的script标签时就不能rm了。

加载中
0
自风
自风
因为只需要匹配头和尾的名称就行了也就是说一个是 <script> 一个是 </script>, 然后接下来用这两个头尾组成一个正则表达式去删除, 不过这里的代码应该是有BUG, 我们的目标是找到两个tag(头和尾)就行了, 而这里却是找打大于两个的tag就略过其实是不对的,你尝试把 tag.size() != 2 改成 tag.size() < 2, 另外, 下面的 tag.get(1) 改成 tag.get(tag.size()-1) 试试
0
xiangfang
xiangfang

引用来自“自风”的评论

因为只需要匹配头和尾的名称就行了也就是说一个是 <script> 一个是 </script>, 然后接下来用这两个头尾组成一个正则表达式去删除, 不过这里的代码应该是有BUG, 我们的目标是找到两个tag(头和尾)就行了, 而这里却是找打大于两个的tag就略过其实是不对的,你尝试把 tag.size() != 2 改成 tag.size() < 2, 另外, 下面的 tag.get(1) 改成 tag.get(tag.size()-1) 试试
因为for循环体里面是为了去除rm里面的设定的标签;可否省去之前的许多判断,直接使用如下正则
<script[^>]*?/>|<script[^>]*?>[\s\S]*?</script>

于是就for循环体就变成了

for (String delTag : delTags){
   String regex = "<" + delTag + "[^>]*?\\/>|<" + delTag + "[^>]*?>[\\s\\S]*?<\\/" + delTag + ">";
   xml = xml.replaceAll(regex, "");
}


自风
自风
如果能达到目的, 是可以的
返回顶部
顶部