在Android中抓取HTML网页的最快方法是什么?

我需要从Android中的非结构化网页中提取信息。 我想要的信息embedded在没有ID的表格中。

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

我应该使用

  • 模式匹配?
  • 使用BufferedReader来提取信息?

还是有更快的方式来获得这些信息?

我认为在这种情况下,寻找一种快速的方法来提取信息是没有意义的,因为当您将其与下载 HTML所需的时间进行比较时,答案中已经提出的方法之间几乎没有性能差异。

因此,假设以最快速度表示最方便,可读和可维护的代码,我build议您使用DocumentBuilderparsing相关的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,我build议隔离相关部分(例如,使用substring(indexOf("<table").. ),如有必要,在parsing之前用String操作纠正剩余的HTML错误。即非常糟糕的 HTML),只要按照其他答案中的build议,使用hacky模式匹配方法即可。

备注

  • 自API Level 8(Android 2.2)开始,XPath就可以使用。 如果开发的API级别较低,则可以使用DOM方法和条件导航到要提取的节点

最快的方法是自己parsing特定的信息。 你似乎事先就知道HTML结构。 BufferedReaderStringStringBuilder方法应该足够了。 以下是一个启动示例,显示您自己问题的第一段:

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

实际上,parsing在所有情况下都比模式匹配快得多。 模式匹配比较容易,但是当使用复杂的正则expression式模式时,可能会产生意想不到的结果。

您也可以考虑使用更灵活的第三方HTMLparsing器,而不是自己写一个。 它不会像以前已知的信息那样快速parsing自己。 它会更加简洁和灵活。 有了体面的HTMLparsing器,速度的差异是微不足道的。 我强烈build议Jsoup这个。 它支持类似jQuery的CSSselect器 。 提取您的问题的第一段将是如此简单:

 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从特定的页面select特定的信息。 如果您仍然无法使用Jsoup和CSSselect器来自定义 ,请随时在注释中发布URL,我会build议如何去做。

你为什么不写

int start = data.indexOf(“Description”);

之后,采取所需的子string。

当你废Html网页。 你可以做两件事。 第一个是使用REGEX。 另一个是Htmlparsing器。

使用正则expression式是不可取的。 因为它在运行时会导致逻辑exception。

使用Htmlparsing器更复杂。 你不能确定适当的输出会来。 它也由我的经验造成了一些运行时exception。

所以最好使url对Xml文件的响应。 并做xmlparsing是非常简单和有效的。

你为什么不创build一个脚本,使用cURL和简单的HTML DOM分析器来抓取,只需从该页面获取所需的值? 这些工具可以与PHP一起工作,但是其他工具可以用于任何您需要的语言。

这样做的一种方法是把HTML放入一个string,然后手动search和parsing通过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))); 

就像我说的…真的很sl </s>。 但是,如果你只做了一次这样的事情,而且你需要这样做,那么这可能就是个诀窍。