Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在HTML(Java)中快速查找值的方法_Java_Html_Regex - Fatal编程技术网

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

在HTML(Java)中快速查找值的方法,java,html,regex,Java,Html,Regex,使用正则表达式,获取网站HTML并查找此标记内的值(或任何属性的值)的最简单方法是什么: [剪报] [剪报] 取决于您需要构建的Http请求的复杂程度(身份验证等)。这是我以前见过的一种简单方法 StringBuilder html = new StringBuilder(); java.net.URL url = new URL("http://www.google.com/"); BufferedReader input = null; try { input new Buffer

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


[剪报]
[剪报]

取决于您需要构建的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));
}
StringBuilder html=new StringBuilder();
java.net.URL URL=新URL(“http://www.google.com/");
BufferedReader输入=null;
试一试{
输入新的BufferedReader(
新的InputStreamReader(url.openStream());
字符串HTMLINE;
而((htmlLine=input.readLine())!=null){
appendLine(htmlLine);
}
}
最后{
input.close();
}
Pattern exp=Pattern.compile(

“您可能想查看Apache的org.Apache.commons.HttpClient包和相关包的文档。从Java应用程序发送HTTP请求非常容易。浏览文档会让您走上正确的方向。

我没有尝试过这一点,但基本框架不是很简单吗

  • 打开
    java.net.HttpURLConnection
  • 使用
    getInputStream
  • 使用Mike答案中的正则表达式解析出所需的位

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

    你应该使用XPath查询

    只需获取
    /html/head/meta[@name=generator]/@value
    的值即可

    好的教程:

    视情况而定

    如果您正在从一个或多个保证格式良好的HTML站点提取信息,并且您知道不会以某种方式混淆这些信息,那么逐行读取小节并应用正则表达式是一种很好的方法


    另一方面,如果HTML可能损坏或“棘手”"然后你需要使用一个合适的HTML解析器,可能是一个像HTMLIDY这样的许可解析器。小心对从随机网站拖网而来的东西使用严格的HTML或XML解析器。你发现很多所谓的HTML实际上是格式不正确的。

    令人惊讶的是,在解决将正则表达式与HTML一起使用的问题时,没有人会遇到HTML的问题ften不是格式良好,因此使许多HTML解析器完全无用

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


    正则表达式是在文本中找到元素的一种完全有效的方法,因此在HTML中也是如此。如果有任何其他合理的方法来解决原始海报存在的问题,那么就发布它们,而不是引用“使用解析器”或“RTFM”语句。

    当Html不是Xml时,您建议我们如何针对Html执行XPath?您不能保证Html可以作为Xml文档加载以进行XPath导航。现在Html DOM是一个很好的工具,但RegEx可以直接工作。问题中的示例显然是XHTML,因此是Xml,因为它具有自我完形填空功能ng标记。如果元标记被注释掉了怎么办?这仍然会读取它。是这样吗?如果元和名称之间有两个空格怎么办?或者一个标签?或者一个换行符怎么办?如果单词生成器没有被引号包围怎么办?因为这些问题和很多其他问题,我建议不要自己写这篇文章,而是找一个库来为你做格式化的HTML更应该是尝试使用适当的解析器而不是正则表达式的原因。正则表达式永远不应该用于解析HTML,句号。
    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));
    }