Java - 阅读网站而不是源代码

时间:2010-07-08 00:06:02

标签: java io

好的,所以我重新定义了我的最后一个程序......这是:

import java.io.BufferedReader; 
import java.io.InputStreamReader;
import java.net.URL; 
import java.net.URLConnection;


public class asp {
    public static void main(String[] args) {
        try {
            URL game = new URL("http://localhost/mystikrpg/post.php?players");
            URLConnection connection = game.openConnection();
            BufferedReader in = new BufferedReader(new
            InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

问题?当我运行它时......我得到了整个页面......即使是代码源,例如html标签的开头一直到主体和html标签的末尾。

什么时候真的...我希望它输出是1 .... 我能看到的唯一方法是将<body></body>分开字符串......

咩。帮助

5 个答案:

答案 0 :(得分:12)

  

问题?当我运行它时......我得到了整个页面......即使是代码源,例如html标签的开头一直到主体和html标签的末尾。

嗯,这基本上就是一个HTML页面;这就是你得到的。现在,如果您不想手动解析内容,请使用HTML Parser。有many of them但我建议使用Jsoup,这是最优雅的库之一(干净漂亮的API,jQuery like CSS selectors,非详细元素迭代等)。演示:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupDemo {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://localhost/mystikrpg/post.php?players");
        Document doc = Jsoup.parse(url, 3*1000);

        String text = doc.body().text();

        System.out.println(text); // outputs 1
    }
}
看着马,没有手!

PS:作为旁注,我必须说我同意其他一些答案,你应该考虑生成除HTML,JSON甚至原始文本之外的其他东西(至少作为HTML版本的替代品,如果你真的需要它)。

答案 1 :(得分:8)

除非您可以控制post.php,并且能够在没有HTML标记(la web services)的情况下使其恢复正常,否则您将需要解析它返回的HTML文档。

使用HTML Parser,正则表达式对此不太可靠。


使用HTMLParser解析<body>代码的粗略代码段

(确保包含htmlparser.jar

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;    
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.BodyTag;    

public class HTMLParserTest {   
    public static String grabBodyTag (String url) {
        if(!url.startsWith("http://")){url = "http://" + url;}      
        Parser parser = new Parser();               
        TagNameFilter filter = new TagNameFilter("body");       
        try {
            parser.setResource(url);
            NodeList list = parser.parse(filter);
            Node node = list.elementAt(0);          
            if (node instanceof BodyTag) {
                BodyTag tag = (BodyTag) node;
                return   tag.toPlainTextString(); //other formats are available
            }
        } catch (ParserException e) {
            e.printStackTrace();
        }       
        return "found no body tag...";
    }   
    public static void main(String... args){
        System.out.println(grabBodyTag("google.com"));
    }

}

这会为String提供“网页图片视频地图新闻图书Gmail更多...”[省略],在您的情况下,它会返回一个带有“1”的String,可能带有空格在其中(如您的pastebin所示),您必须trim它,然后转换为数字。

结束注意:使用以下代码制作post.php将使您的生活更加轻松如果您不需要该脚本任何其他要返回此结果的东西。

<?php
$number = 1; // or whatever login to get it.
echo $number;
?>

答案 2 :(得分:5)

当您请求页面时,您将获得源代码。这是预期和正常的。您必须解析此源以提取内容。

答案 3 :(得分:3)

从HTML格式的响应中删除内容很不愉快,并且会使代码变得脆弱。

也许您尝试谈论的网络应用/网站有其他方式来传达回复;例如采用XML或JSON格式。

以替代格式获取响应可能需要为HTTP请求设置适当的ACCEPT标头,向查询添加一些额外参数或更改路径。

  • 检查webapp / website的Web API文档,看看是否有任何提及。
  • 或者检查一下webapp源代码......如果有的话。
  • 或者如果这是您的代码,请考虑将其更改为支持XML,JSON甚至 ad hoc 文本响应。 (如果您采用这种方式,最好阅读媒体类型并在回复的“内容类型”标题中设置相应的媒体类型。)

答案 4 :(得分:1)

当您检索网页时,服务器发送给您的是HTML标记之间的所有内容,等等。

我认为您正在寻找的是HTML解析器,它可以让您从网页中提取内容。首先,按照当前的操作检索网页,然后通过解析器运行输出,指示解析器提取所需的部分。

以下是一些HTML解析器: