2012-01-30 114 views
38

我想解析一个简单的网站并从该网站上抓取信息。用JAVA解析网站HTML

我曾经用DocumentBuilderFactory解析XML文件,我试图为html文件做同样的事情,但它总是进入无限循环。

URL url = new URL("http://www.deneme.com"); 
    URLConnection uc = url.openConnection(); 

    InputStreamReader input = new InputStreamReader(uc.getInputStream()); 
    BufferedReader in = new BufferedReader(input); 
    String inputLine; 

    FileWriter outFile = new FileWriter("orhancan"); 
    PrintWriter out = new PrintWriter(outFile); 

    while ((inputLine = in.readLine()) != null) { 
     out.println(inputLine); 
    } 

    in.close(); 
    out.close(); 

    File fXmlFile = new File("orhancan"); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(fXmlFile); 


    NodeList prelist = doc.getElementsByTagName("body"); 
    System.out.println(prelist.getLength()); 

这是什么问题?或者是否有更简单的方法从一个给定的HTML标签从网站上刮取数据?

+0

首先,您可以使用字符串而不是文件。它在哪里进入无限循环?也许是因为来自url的输入流,这似乎并没有结束你有这个问题。 – 2012-01-30 22:19:56

回答

78

有一个更简单的方法来做到这一点。我建议使用JSoup。随着JSoup你可以做这样的事情

Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 
Elements newsHeadlines = doc.select("#mp-itn b a"); 

或者,如果你想身体:

Elements body = doc.select("body"); 

或者,如果你想要的所有链接:

Elements links = doc.select("body a"); 

您不再需要得到连接或处理流。简单。如果你曾经使用jQuery,那么它非常相似。

+0

首先,谢谢!但是,#mp-itn b a是什么? – CanCeylan 2012-01-30 22:17:37

+1

#mp-itn只是一个包含'id =“mp-itn”' – 2012-01-30 22:18:23

+1

的容器请参阅我的编辑。理解css选择器的工作方式对你真的很有帮助。 – 2012-01-30 22:19:35

19

绝对JSoup就是答案。 ;-)