2015-11-29 2 views
2

Нужно получить html с сервера и проанализировать его с помощью xpath (xpath обязательно я не могу использовать что-то еще). Мой код:Parse html using 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); 

Это хорошо работает, но функция чистой() займет много времени (для страницы может занять> 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.4 сек ~ 1,5 секунды. Но это тоже очень медленно.

Как увеличить скорость обработки больше?

+0

Вы пробовали https://github.com/code4craft/xsoup? Он утверждал, что он быстрее, чем HtmlCleaner. – user882813

+0

Да, я пробовал это прямо, также jsoup использовать его – comalex3

ответ

0

Мы используем шаблоны регулярных выражений над одной строкой, содержащей HTML. Этот подход является более стабильным, когда HTML документ иногда имеет структурные изменения (после страницы редизайн и т.д.)

+0

на самом деле мы используем регулярное выражение тоже, но также мне нужно xpath – comalex3

0

Как я могу увеличить скорость обработки больше?

Удалите данные из анализаторов, основанных на DOM (с интенсивной памятью), и перейдите к подходу, основанному на событиях (SAX-синтаксические анализаторы).

https://en.wikipedia.org/wiki/Simple_API_for_XML

С саксофоном парсер вы в основном реализовать стек для извлечения узлов, представляющих интерес.

+0

любой пример, как я могу использовать sax и xpath? – comalex3

+0

Большинство библиотек состоят из 3 событий, которые вы можете подключить к: '' ' SaxParser parser = new SaxParser(); parser.OnOpenTag + = (tag) => {}; parser.OnDataElement + = (data) => {}; parser.OnCloseTag + = (tag) => {}; '' 'Вы можете поддерживать стек или счетчик, чтобы знать, насколько глубоко вы находитесь в документе. –