0

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

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

7 回答 7

10

取决于您需要构建的 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));
}

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

于 2008-08-28T00:38:16.360 回答
4

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

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

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

于 2010-12-16T22:02:39.357 回答
1

您应该使用 XPath 查询。

这就像获得价值一样简单/html/head/meta[@name=generator]/@value

一个很好的教程:Parsing an XML Document with XPath

于 2008-09-26T01:09:28.310 回答
0

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

于 2008-08-28T01:22:32.027 回答
0

我还没有尝试过,但基本框架不会是

  1. 打开一个java.net.HttpURLConnection
  2. 使用获取输入流getInputStream
  3. 使用 Mike's answer 中的正则表达式来解析出你想要的位
于 2008-08-28T01:26:26.227 回答
0

严格来说,你不能确定你得到了正确的值,因为元标记可能被注释掉,或者元标记可能是大写的等等。这取决于你有多确定 HTML 可以被认为是“不错的” ”。

于 2008-09-19T11:07:23.793 回答
0

这取决于。

如果您要从一个或多个站点中提取信息,这些站点保证是格式良好的 HTML,并且您知道 <meta> 不会以某种方式被混淆,那么逐行读取 <head> 部分并应用正则表达式是一个很好的方法。

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

于 2009-11-22T09:23:58.713 回答