Я должен извлечь информацию из неструктурированной веб-страницы в Android. Информация, которую я хочу, встраивается в таблицу, которая не имеет идентификатора.
<table>
<tr><td>Description</td><td></td><td>I want this field next to the description cell</td></tr>
</table>
Если я использую
Или есть ли более быстрый способ получить ту информацию?
Я думаю, что в данном случае нет смысла искать быстрый способ извлечения информации, поскольку практически нет разницы в производительности между методами, уже предложенными в ответах, если сравнить их со временем, которое потребуется для загрузки 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, я рекомендую выделить соответствующую часть (например, используя Замечания Почему бы вам не создать скрипт, который выполняет поиск с помощью cURL и простого парсера html dom и просто берет нужное вам значение со страницы? Эти инструменты работают с PHP, но существуют и другие инструменты для любого нужного вам языка. Один из способов сделать это - поместить html в строку, а затем вручную выполнить поиск и разобрать строку. Если вы знаете, что теги будут располагаться в определенном порядке, вы сможете просмотреть его и найти данные. Однако это немного небрежно, поэтому вопрос в том, хотите ли вы, чтобы он работал сейчас ? или работать хорошо ? как я уже сказал ... очень небрежно. Но если вы делаете это только один раз и вам нужно, чтобы это работало, это может помочь. Самым быстрым способом будет анализ конкретной информации самостоятельно. Кажется, вы заранее точно знаете структуру HTML. Методы Синтаксический анализ практически во всех случаях определенно быстрее, чем сопоставление с образцом. Сопоставление с образцом проще, но есть определенный риск, что это может привести к неожиданным результатам, особенно при использовании сложных шаблонов регулярных выражений. Вы также можете рассмотреть возможность использования более гибкого стороннего парсера HTML вместо того, чтобы писать его самостоятельно. Это будет не так быстро, как разбор заранее известной информации. Однако он будет более лаконичным и гибким. С приличными парсерами HTML разница в скорости незначительна. Для этого я настоятельно рекомендую Jsoup . Он поддерживает селекторы CSS, подобные jQuery . Тогда извлечь первый абзац вашего вопроса будет так же просто: Непонятно, о какой веб-странице вы говорите, поэтому я не могу привести более подробный пример, как вы могли бы выбрать конкретную информацию с конкретной страницы, используя Jsoup. Если вы все еще не можете понять это самостоятельно, используя селекторы Jsoup и CSS , то не стесняйтесь размещать URL-адрес в комментарии, и я подскажу, как это сделать. Когда вы обрезаете Html веб-страницу. Вы можете сделать для этого две вещи. Первая - это использование REGEX. Другая - парсеры Html. Использование Regex не является предпочтительным для всех. Потому что он вызывает логическое исключение во время выполнения. Использование Html парсера более сложное. Вы не можете быть уверены, что правильный вывод будет получен. По моему опыту, он тоже вызывает некоторые исключения во время выполнения. Поэтому лучше сделать ответ url в Xml файл. и сделать xml парсинг - это очень просто и эффективно. Почему бы вам просто не написать int start = data.indexOf ("Description"); После этого возьмите требуемую подстроку . substring(indexOf("
) и при необходимости исправить оставшиеся ошибки HTML с помощью операций
String
перед разбором. Однако если это становится слишком сложным (например, очень плохой 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)));
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);
}
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);
}
Похожие вопросы: