LINUX.ORG.RU

[java] html парсер

 


0

0

Собрался писать бота для одной браузерной онлайн игры.
Соответственно надо будет парсить html-страницы. Не факт что разбираемые страницы будут 100% валидным html-документом.
В связи с эти вопрос что лучше использовать для такой ситуации
Первое что приходит в голову это regexp, но может есть что то поинтереснее.
В гугле уже успел покопаться на эту тему, нашел пару решений, но интересно узнать кто что использовал для решения подобных задач.


Использовал регэкспы. В принципе их достаточно, проблемы только в случае изменения страниц. Но если страница изменится, то и парсинг html особо не поможет избежать проблем.

unC0Rr ★★★★★
()

Tagsoup есть такая весчь. Сейчас сам юзаю. Парсит невалидный html.

anonymous
()
Ответ на: комментарий от ef37

Я правильно понимаю что jtidy, что tagsoup просто приводят невалидны html, к валидному виду, а обрабатывать я их уже должен сам, например с помощью javax.xml.parsers?

n4ela
() автор топика
Ответ на: комментарий от n4ela

Я правильно понимаю что jtidy, что tagsoup просто приводят невалидны html, к валидному виду, а обрабатывать я их уже должен сам, например с помощью ja

vax.xml.parsers?

Не обязательно, jtidy может отдать документ в DOM.

Типа такого:

Tidy tidy = new Tidy();
tidy.setQuiet(true);
tidy.setShowWrnings(false);
tidy.setCharEncoding(Configuration.UTF8);
Document doc = tidy.parseDOM(get.getResponseBodyAsStream(), null);
ef37 ★★
()

У меня с tagsoup никогда проблем не было. Использую его в Scala. Документы после разбора получаю в scala-вском XML с всеми прилагающимися плюшками. Это очень удобно.

Zenom ★★★
()
Ответ на: комментарий от ef37

Спасибо, с тем как получать xml-документ разобрался.
А вот с самим парсингом не очень, точнее все вроде понятно но не очень красиво.
Для работы с xml выбрал XPath т.к. он вроде более удобный для работы.
Вот например я хочу загрузить файл с диска и разобрать его.

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); 
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(setting);
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//server | //login | //password");
        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
И мне надо поставить значения в переменные server, login и password.
Но что бы это сделать как можно более точно(скажем если в xml файле параметры server, login и password могут располагаться в разном порядке) мне придется прогонять через цикл и сверять nodes.item(i).getNodeName() и потом присваивать nodes.item(i).getTextContent() переменным.
Либо есть еще вариант искать значения в xml-файле по одному, т.е. три раза повторить один и тот же код
       XPathExpression expr = xpath.compile("//server | //login | //password");
        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
Понятно что второй и третий раз переменные объявлять не надо, но все равно как то много кода получается.
Как решить задачу наиболее красиво?
Вообще когда я за это брался думал что будет что то типа:
XmlParser xmlParser = new XmlParser(new File("myFile.xml"));
ArrayList<String> server = xmlParser.findTags("//server");
ArrayList<String> login = xmlParser.findTags("//login");
и.т.д

n4ela
() автор топика
Ответ на: комментарий от n4ela

Че то протупил, написал свой вспомогательный класс.
Но различные решения все равно интересны.

n4ela
() автор топика

Самое тупое и простое решение - прогонять все страницы через tidy и парсить как валидный xml.

anonymous
()
Ответ на: комментарий от n4ela

У, как все запущено... Рано тебе ботов писать.

anonymous
()
Ответ на: комментарий от Zenom

Да и вообще имею сказать, что Scala для подобных задач подходит идеально. Dispatch + tagsoup и вот уже у нас готов бот в несколько строк кода.

Извиняюсь, не удержался от пеара.

Zenom ★★★
()

Используй htmlunit. Сможешь даже js эмулировать.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.