使用JAVA解析网站HTML

46

我想解析一个简单的网站并从中获取信息。

以前我用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 标签的数据?


首先,您可以使用字符串而不是文件。无限循环在哪里进入?也许是由于来自URL的输入流似乎没有结束,您才会遇到这个问题。 - Horatiu Jeflea
3个回答

90

有一种更简单的方法来实现这个。我建议使用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,那么这非常相似。


首先,谢谢!但是 #mp-itn b a 是什么? - CanCeylan
1
#mp-itn只是一个带有id="mp-itn"的容器。 - Amir Raminfar
2
看一下我的修改。了解CSS选择器的工作原理真的会帮助你。 - Amir Raminfar
2
好的,http://jsoup.org/cookbook/extracting-data/dom-navigation 这正是我需要的,谢谢。 - CanCeylan
1
一个库比裸代码更好,我会选择它。 - Horatiu Jeflea
一个问题。Jsoup是什么意思?就像DNS是域名系统一样。那么Jsoup是什么呢? - God

22

毫无疑问,JSoup 就是答案。;-)


5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接