Java 使用xpath解析html

Java 使用xpath解析html,java,android,Java,Android,需要从服务器获取html并使用xpath解析它(xpath是必须的,我不能使用其他东西)。我的代码: TagNode tagNode = new HtmlCleaner().clean(html); Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode); XPath xpathObject = XPathFactory.newInstance().newXPath(); NodeList node

需要从服务器获取html并使用xpath解析它(xpath是必须的,我不能使用其他东西)。我的代码:

TagNode tagNode = new HtmlCleaner().clean(html);
Document doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);
XPath xpathObject = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xpathObject.evaluate(xpathString, html, XPathConstants.NODESET);
它工作得很好,但是函数clean()需要很多时间(因为一个页面可能需要>30秒)

我找到了另一个解决方案-使用Jsoup,所以我的新代码是-

Document doc = Jsoup.parse(html);
W3CDom w3cDom = new W3CDom();
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);

XPath xpathObject = XPathFactory.newInstance().newXPath();
str = (String) xpathObject.evaluate(xpathString, w3cDoc, XPathConstants.STRING);
现在解析并转换为org.w3c.dom.Document大约需要1s+评估0.4s~1.5秒。但这也很慢


如何进一步提高处理速度?

我们在一个包含HTML的字符串上使用正则表达式模式。 当HTML文档偶尔发生结构更改时(在重新设计页面等之后),这种方法更稳定

如何进一步提高处理速度

从基于DOM的解析器(内存密集型)转向基于事件的方法(SAX解析器)


使用sax解析器,您基本上实现了一个堆栈来提取感兴趣的节点。

实际上我们也使用正则表达式,但我还需要XPath。您试过了吗?它声称比HtmlCleaner更快。是的,我直接尝试过,而且jsoup使用itany示例说明如何使用sax和xpath?大多数库都由3个可以附加到的事件组成:``SaxParser parser=new SaxParser();parser.OnOpenTag+=(标记)=>{};parser.OnDataElement+=(数据)=>{};parser.OnCloseTag+=(标记)=>{};```您可以维护一个堆栈或计数器,以了解您在文档中的深度。