Подтвердить что ты не робот

Каков самый быстрый способ очистить HTML-страницу в Android?

Мне нужно извлечь информацию с неструктурированной веб-страницы в Android. Информация, которую я хочу, встроена в таблицу, в которой нет идентификатора.

<table> 
<tr><td>Description</td><td></td><td>I want this field next to the description cell</td></tr> 
</table>

Должен ли я использовать

  • Соответствие шаблону?
  • Использовать BufferedReader для извлечения информации?

Или есть более быстрый способ получить эту информацию?

4b9b3361

Ответ 1

Я думаю, что в этом случае нет смысла искать быстрый способ извлечения информации, так как практически нет разницы в производительности между методами, уже предложенными в ответах, когда вы сравниваете их со временем, которое потребуется для загрузки HTML-кода.

Итак, полагая, что самым быстрым вы имеете в виду самый удобный, читаемый и поддерживаемый код, я предлагаю вам использовать DocumentBuilder для синтаксического анализа соответствующего HTML-кода и извлеките данные, используя XPathExpression s:

Document doc = DocumentBuilderFactory.newInstance()
  .newDocumentBuilder().parse(new InputSource(new StringReader(html)));

XPathExpression xpath = XPathFactory.newInstance()
  .newXPath().compile("//td[text()=\"Description\"]/following-sibling::td[2]");

String result = (String) xpath.evaluate(doc, XPathConstants.STRING);

Если вам удастся получить недействительный HTML, я рекомендую выделить соответствующую часть (например, используя substring(indexOf("<table")..) и при необходимости исправить оставшиеся ошибки HTML с помощью операций String до разбора. Если это становится слишком сложным (т.е. Очень плохой HTML), просто переходите к подходу к подходу к хакерскому шаблону, как это предлагается в других ответах.

Примечания

  • XPath доступен с уровня API 8 (Android 2.2). Если вы разрабатываете более низкие уровни API, вы можете использовать DOM-методы и условные обозначения, чтобы перейти к node, которые хотите извлечь

Ответ 2

Самый эффективный способ будет самостоятельно анализировать конкретную информацию. Кажется, вы знаете структуру HTML именно заранее. BufferedReader, String и StringBuilder должно быть достаточно. Вот пример запуска, который отображает первый абзац вашего собственного вопроса:

public static void main(String... args) throws Exception {
    URL url = new URL("http://stackoverflow.com/questions/2971155");
    BufferedReader reader = null;
    StringBuilder builder = new StringBuilder();
    try {
        reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        for (String line; (line = reader.readLine()) != null;) {
            builder.append(line.trim());
        }
    } finally {
        if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
    }

    String start = "<div class=\"post-text\"><p>";
    String end = "</p>";
    String part = builder.substring(builder.indexOf(start) + start.length());
    String question = part.substring(0, part.indexOf(end));
    System.out.println(question);
}

Анализ практически во всех случаях определенно быстрее, чем сопоставление шаблонов. Сравнение шаблонов проще, но существует определенный риск того, что он может дать неожиданные результаты, конечно, при использовании сложных шаблонов регулярных выражений.

Вы также можете использовать более гибкий сторонний парсер HTML вместо того, чтобы писать его самостоятельно. Это будет не так быстро, как разобраться с заранее известной информацией. Однако он будет более кратким и гибким. С достойными анализаторами HTML разница в скорости довольно незначительна. Я настоятельно рекомендую Jsoup для этого. Он поддерживает jQuery-подобные CSS-селектора. Извлечение абзаца firsrt вашего вопроса будет таким же простым, как:

public static void main(String... args) throws Exception {
    Document document = Jsoup.connect("http://stackoverflow.com/questions/2971155").get();
    String question = document.select("#question .post-text p").first().text();
    System.out.println(question);
}

Непонятно, о какой веб-странице вы говорите, поэтому я не могу привести более подробный пример того, как вы можете выбрать конкретную информацию с конкретной страницы с помощью Jsoup. Если вы все еще не можете понять это самостоятельно, используя Jsoup и селектор CSS, тогда не стесняйтесь публиковать URL-адрес в комментарии, и я предложите, как это сделать.

Ответ 3

Почему бы вам просто не написать

int start = data.indexOf( "Описание" );

После этого возьмите требуемую подстроку.

Ответ 4

Когда вы переходите на страницу html webpage. Две вещи, которые вы можете сделать для этого. First One использует REGEX. Другой является Html-парсерами.

Использование Regex не является предпочтительным для всех. Потому что он вызывает логическое исключение во время выполнения.

Использование Html Parser более сложно сделать. вы не можете уверен, что придет правильный выход. по моему опыту, это тоже сделало исключение из среды выполнения.

Так лучше откликнуться на URL-адрес файла Xml. и xml parsing очень прост и эффективен.

Ответ 5

Почему бы вам не создать script, который выполняет очистку с помощью cURL и простого анализатора html dom и просто возьмите значение, которое вы нужно с этой страницы? Эти инструменты работают с PHP, но существуют другие инструменты для существования для любого языка, который вам нужен.

Ответ 6

Один из способов сделать это - поместить html в String, а затем вручную искать и анализировать через String. Если вы знаете, что теги будут поступать в определенном порядке, вы сможете просканировать его и найти данные. Это, однако, неряшливо, поэтому вопрос о том, хотите ли вы сейчас работать? или хорошо работать?

int position = (String)html.indexOf("<table>");  //html being the String holding the html code
String field = html.substring(html.indexOf("<td>",html.indexOf("<td>",position)) + 4, html.indexOf("</td>",html.indexOf("</td>",position)));

как я сказал... очень неряшливый. Но если вы делаете это только один раз, и вам нужно, чтобы это работало, это могло бы сделать трюк.