`
tianhewulei
  • 浏览: 24070 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

NekoHtml 解析内容时需要注意的地方

阅读更多
如果需要在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="sdfs.html">ABC</a></td>
   </tr>
</tbody>

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


附件里面放置的nekohtml需要使用到的三个jar包。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics