六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 174|回复: 0

HtmlUnit解析html会丢掉不可见的Element

[复制链接]

升级  98.33%

147

主题

147

主题

147

主题

举人

Rank: 3Rank: 3

积分
495
 楼主| 发表于 2013-2-7 20:01:08 | 显示全部楼层 |阅读模式
最近使用htmlunit来作为后端抽取数据,htmlunit的DOM解析,使用xpath定位结点的过程发现有这个问题。
不知道是故意这么做,还是个bug。
于是对重写了前端获取xpath的代码,让它也忽略不可见Element,保持一致,可以解决我们的问题:
function getXPath(element){if (element && element.id)return '//*[@id="' + element.id + '"]';var paths = [];for (; element && element.nodeType == 1; element = element.parentNode){var index = 0;for (var sibling = element.previousSibling; sibling; sibling = sibling.previousSibling){if (sibling.localName == element.localName && isVisible(sibling))++index;}var tagName = element.localName.toLowerCase();var pathIndex = (index ? "[" + (index+1) + "]" : "");paths.splice(0, 0, tagName + pathIndex);}return paths.length ? "/" + paths.join("/") : null;    };  判断是否可见:
function isVisible(element){var doc = element.ownerDocument;var docView = XPCOMUtils.QI(doc,_CI.nsIDOMDocumentView);var viewCss = XPCOMUtils.QI(docView.defaultView,_CI.nsIDOMViewCSS);var computedCss = viewCss.getComputedStyle(element,"");var visiable = computedCss.getPropertyCSSValue("visibility").getStringValue();var display = computedCss.getPropertyCSSValue("display").getStringValue();return visiable != "hidden" && display != "none";}其中XPCOMUtils是XPCOM的QueryInterface, createInstance,getService的一个代码简化的封装:
var _CI = Components.interfaces;var _CC = Components.classes;function XPCOMUtils() {}(function() {this.CCSV = function(cName, ifaceName){if (_CC[cName])return _CC[cName].getService(_CI[ifaceName]);  // if fbs fails to load, the error can be _CC[cName] has no propertieselsealert("Can't get the components class name: " + cName);};this.CCIN = function(cName, ifaceName){    return _CC[cName].createInstance(_CI[ifaceName]);};this.QI = function(obj, iface){    return obj.QueryInterface(iface);};// ************************************************************************************************}).apply(XPCOMUtils);
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表