在 HTML (Java) 中查找值的快速方法

Posted

技术标签:

【中文标题】在 HTML (Java) 中查找值的快速方法【英文标题】:Quick way to find a value in HTML (Java) 【发布时间】:2010-09-07 01:57:04 【问题描述】:

使用正则表达式,获取网站 html 并找到此标记内的值(或任何属性的值)的最简单方法是什么:

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]

【问题讨论】:

【参考方案1】:

取决于您需要构建的 Http 请求的复杂程度(身份验证等)。这是我过去见过的一种简单方法。

StringBuilder html = new StringBuilder();
java.net.URL url = new URL("http://www.google.com/");
BufferedReader input = null;
try 
    input new BufferedReader(
        new InputStreamReader(url.openStream()));

    String htmlLine;
    while ((htmlLine=input.readLine())!=null) 
        html.appendLine(htmlLine);
    

finally 
    input.close();


Pattern exp = Pattern.compile(
    "<meta name=\"generator\" value=\"([^\"]*)\" />");
Matcher matcher = exp.matcher(html.toString());
if(matcher.find())

    System.out.println("Generator: "+matcher.group(1));

编译时可能会发现很多错别字。 (希望这不是家庭作业)

【讨论】:

如果元标记被注释掉了怎么办?这仍然会读取它。那正确吗?如果 meta 和 name 之间有两个空格怎么办?还是标签?还是换行?如果单词生成器没有被引号包围怎么办?由于这些问题以及更多问题,我建议您不要自己编写此代码,而是寻找一个可以为您完成此任务的库。【参考方案2】:

令人惊讶的是,在解决将 RegEx 与 HTML 结合使用的问题时,没有人会遇到 HTML 经常格式正确的问题,从而使许多 HTML 解析器完全无用。

如果您正在开发分析网页的工具,并且事实上这些网页不是格式良好的 HTML,那么“永远不应该使用正则表达式来解析 HTML”和“使用 HTML 解析器”的说法完全是假的。事实是,在现实世界中,人们根据自己的喜好创建 HTML,但不一定适合解析器。

RegEx 一种在文本中查找元素的完全有效的方法,因此在 HTML 中。如果有任何其他合理的方式来解决原始发帖人的问题,请发布它们,而不是引用“使用解析器”或“RTFM”声明。

【讨论】:

【参考方案3】:

您应该使用 XPath 查询。

就像获取/html/head/meta[@name=generator]/@value的值一样简单。

一个不错的教程:Parsing an XML Document with XPath

【讨论】:

当 Html 不是 Xml 时,您建议我们如何针对 Html 执行 XPath?您不能保证 Html 可以加载为用于 XPath 导航的 Xml 文档。现在一个 Html DOM 是一个很好的工具,但是 RegEx 可以工作并且是直接的。 问题中的示例显然是 XHTML,因此是 XML,因为它有一个自闭合标签。【参考方案4】:

您可能需要查看 Apache 的 org.apache.commons.HttpClient 包和相关包 here 的文档。从 Java 应用程序发送 HTTP 请求非常容易。浏览文档应该会让你朝着正确的方向前进。

【讨论】:

【参考方案5】:

严格来说,你不能确定你得到了正确的值,因为元标记可能被注释掉,或者元标记可能是大写的等等。这取决于你对 HTML 可以考虑的确定程度作为“好”。

【讨论】:

【参考方案6】:

视情况而定。

如果您从一个或多个网站中提取信息,这些网站可以保证是格式良好的 HTML,并且您知道 不会以某种方式被混淆,那么您可以逐行阅读

部分并且应用正则表达式是一个好方法。

另一方面,如果 HTML 可能被破坏或“棘手”,那么您需要使用适当的 HTML 解析器,可能是像 HTMLTidy 这样的宽松解析器。谨防对从随机网站拖网而来的内容使用严格的 HTML 或 XML 解析器。你发现很多所谓的 HTML 实际上是格式错误的。

【讨论】:

格式良好的 HTML 更有理由尝试使用适当的解析器而不是正则表达式。永远不应该使用正则表达式来解析 HTML,句号。【参考方案7】:

这个我没试过,但是基本框架不会是

    打开java.net.HttpURLConnection 使用getInputStream获取输入流 使用 Mike 回答中的正则表达式解析出你想要的位

【讨论】:

以上是关于在 HTML (Java) 中查找值的快速方法的主要内容,如果未能解决你的问题,请参考以下文章

查找列表中某个值的位置

使用快速查找算法 (Java) 在有向图中查找所有弱连通分量的优化

java 数组中查找和为特定值的两个元素

在列表中查找具有值的最小字典键的 Pythonic 方法?

typescript 这是一个快速演示,使用一组枚举来获取仅提供标识符时查找值的完整描述。代码是一个

Pandas:在多列中查找具有匹配值的行的 Pythonic 方法(分层条件)