日期:2014-05-17  浏览次数:20630 次

NekoHtml xpath 解析内容时需要注意的地方
如果需要在HTML页面中提取数据,那么NekoHTML 是个不错的工具。因为HTML跟XML不一样,可能存在一些格式不完整的元素,譬如没有end tag的table等,这个时候,NekoHTML是个很尽责的清道夫和修理工,可以帮助我们整理这些缺陷数据,最终生成一个DOM Tree。? 得到DOM Tree话,使用XPath就可以轻松获取所需数据了:-)

? 下面是几个需要注意的问题:

1、如何使用NekoHTML?

???? 必须在 Java Build Path里加入 nekohtml.jar , xercesImpl.jar 以及xalan.jar。下载的NekoHTML目录中并没有xercesImpl.jar和xalan.jar,需要自己下载。



2、如何获取XPath?

??? 当然大家可以把网页的代码下下来,然后使用“人工智能”的方式获取,但是过程确实让人眼花缭乱、心力交瘁。使用FireBug吧,可以自动生成 XPath。

??? updated:

??? Firebug生成的XPath中如果含有TBODY标签,需要把TBODY去掉,否则不能正确获取网页的内容。如Firebug生成的XPath为 /html/body/table/tbody/tr,那么则需要修改为/html/body/table/tr。



4、如何正确结合NekoHTML和XPath?

??? XPath的Tag必须大写。如

??? String divXpath = "//DIV";//正确

??? String divXpath = "//div";//错误
???
??? 节点的属性按照页面中实际的大小写进行书写
??? 如: //DIV[@class="title"]/EM[@class="right"]/A
?? 意思就是找到页面中div的class为title的大块,然后向下找节点为EM,同时其class为right的小块,再继续延伸找到此小块下的A节 点。

需要注意的是,你写的xpath路径必须得是连续的,比如说
<div class="title">
?? <div>
????? <em class="right"><a></a></em>
?? </div>
</div>

这个时候如果你按照上述的xpath来找a标签的话,很显然是找不到的,因为div class=“title”下是没有em的,对于新手需要特别注意。


对于xpath的写法,可以参考 http://www.w3school.com.cn/xpath/

5.对于table的处理

需要注意的是如果你给解析器的字符串是下面的这种形式
<tbody>
?? <tr>
????? <td id="tag"><a href="http://blog.163.com/xing_mu_1/blog/sdfs.html">ABC</a></td>
?? </tr>
</tbody>

如果我现在想要找上述内容中的td,给定XPATH //TD[@id='tag'],你会发现,程序根本无法找到这个node,原因是对于neko来说,对于一个不完整的table,他根本不会将其组装成 一个dom树,也就是说上面的内容经过解析器转换之后,就只会保留
<a href='http://blog.163.com/xing_mu_1/blog/sdfs.html'>
??? ABC
</a>
这一段内容,其他的已经被neko无视掉了。
解决办法,在这段内容的前后加入一段table的闭合标签之后再放入解析器中进行解析
<table>
<tbody>
?? <tr>
????? <td id="tag"><a href="http://blog.163.com/xing_mu_1/blog/sdfs.html">ABC</a></td>
?? </tr>
</tbody>
</table>