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

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

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

Если я использую

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

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

25
задан Artjom B. 4 September 2015 в 17:39
поделиться

6 ответов

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

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

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(") и при необходимости исправить оставшиеся ошибки HTML с помощью операций String перед разбором. Однако если это становится слишком сложным (например, очень плохой HTML), просто перейдите к хакерскому подходу сопоставления шаблонов, как было предложено в других ответах.

Замечания

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

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

0
ответ дан 28 November 2019 в 18:10
поделиться

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

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)));

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

0
ответ дан 28 November 2019 в 18:10
поделиться

Самым быстрым способом будет анализ конкретной информации самостоятельно. Кажется, вы заранее точно знаете структуру 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 . Он поддерживает селекторы CSS, подобные jQuery . Тогда извлечь первый абзац вашего вопроса будет так же просто:

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-адрес в комментарии, и я подскажу, как это сделать.

19
ответ дан 28 November 2019 в 18:10
поделиться

Когда вы обрезаете Html веб-страницу. Вы можете сделать для этого две вещи. Первая - это использование REGEX. Другая - парсеры Html.

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

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

Поэтому лучше сделать ответ url в Xml файл. и сделать xml парсинг - это очень просто и эффективно.

2
ответ дан 28 November 2019 в 18:10
поделиться

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

int start = data.indexOf ("Description");

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

1
ответ дан 28 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: