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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设置解析器参数   为了更加精确的控制解析的动作,nekohtml提供了相应的设置函数。如下列: // settings on HTMLConfiguration org.apache.xerces.xni.parser.XMLParserConfiguration config = new org.cyberneko.html.HTMLConfiguration(); config.setFeature("http://cyberneko.org/html/features/augmentations", true); config.setProperty("http://cyberneko.org/html/properties/names/elems", "lower"); // settings on DOMParser org.cyberneko.html.parsers.DOMParser parser = new org.cyberneko.html.parsers.DOMParser(); parser.setFeature("http://cyberneko.org/html/features/augmentations", true); parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");nekohtml功能(feature)列表 功能 默认值 描述 http://cyberneko.org/html/features/balance-tags True 是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真。此处提供设置功能,为了性能的原因。 http://cyberneko.org/html/features/balance-tags/ignore-outside-content False 是否忽略文档根元素以后的数据。如果为false,<html>和<bod>被忽略,所有的内容都被解析。 http://cyberneko.org/html/features/document-fragment False 解析HTML片段是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。 http://apache.org/xml/features/scanner/notify-char-refs False 当遇到字符实体引用(如&#x20;)是否将(#x20)报告给相应地文档处理器。 http://apache.org/xml/features/scanner/notify-builtin-refs False 当遇到XML内建的字符实体引用(如&amp;)是否将(amp)报告给相应地文档处理器。 http://cyberneko.org/html/features/scanner/notify-builtin-refs False 当遇到HTML内建的字符实体引用(如&copy;)是否将(copy)报告给相应地文档处理器。 http://cyberneko.org/html/features/scanner/script/strip-comment-delims False 是否剥掉<script>元素中的<!-- -->等注释符。 http://cyberneko.org/html/features/augmentations False 是否将与HTML事件有关的infoset项包括在解析管道中。 http://cyberneko.org/html/features/report-errors False 是否报告错误。nekohtml属性列表 属性 默认值 值域 描述 http://cyberneko.org/html/properties/filters null XMLDocumentFilter[] 在解析管道的最后按数组顺序追加自定义的处理组件(过滤器),必须为数组类型。 http://cyberneko.org/html/properties/default-encoding Windows-1252 IANA encoding names 默认的HTML文件编码 http://cyberneko.org/html/properties/names/elems upper upper,lower,match 如果整理识别出的元素名称 http://cyberneko.org/html/properties/names/attrs lower upper,lower,no-change 如果整理识别出的属性名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值