如何"扫描"一个网站(或页面)的信息,并将其带入我的程序?

Jam*_*mes 51 html java web-scraping jsoup

好吧,我正在试图弄清楚如何从网页中提取信息,并将其带入我的程序(用Java).

例如,如果我知道我想要信息的确切页面,为了简单起见,Best Buy项目页面,我如何从该页面获得我需要的相应信息?喜欢标题,价格,描述?

这个过程甚至会被称为什么?我不知道甚至开始研究这个.

编辑:好的,我正在为JSoup(由BalusC发布的那个)运行测试,但我一直收到这个错误:

Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object;
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209)
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117)
at org.jsoup.parser.Parser.parse(Parser.java:76)
at org.jsoup.parser.Parser.parse(Parser.java:51)
at org.jsoup.Jsoup.parse(Jsoup.java:28)
at org.jsoup.Jsoup.parse(Jsoup.java:56)
at test.main(test.java:12)
Run Code Online (Sandbox Code Playgroud)

我有Apache Commons

Bal*_*usC 93

使用像Jsoup这样的HTML解析器.这比我在Java中提供其他HTML解析器更优先,因为它支持CSS选择器这样的jQuery.此外,它表示节点列表的类实现,以便您可以在增强的for循环中迭代它(因此不需要在普通的Java DOM解析器中使用冗长和类似的类).ElementsIterableNodeNodeList

这是一个基本的启动示例(只需将最新的Jsoup JAR文件放在类路径中):

package com.stackoverflow.q2835505;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test {

    public static void main(String[] args) throws Exception {
        String url = "https://stackoverflow.com/questions/2835505";
        Document document = Jsoup.connect(url).get();

        String question = document.select("#question .post-text").text();
        System.out.println("Question: " + question);

        Elements answerers = document.select("#answers .user-details a");
        for (Element answerer : answerers) {
            System.out.println("Answerer: " + answerer.text());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

正如您可能已经猜到的那样,这会打印出您自己的问题以及所有回答者的姓名.

  • 如果有任何.NET程序员感兴趣,我已经将jsoup移植到.NET:http://nsoup.codeplex.com/.希望这有助于任何人. (8认同)
  • 哇,这个不错!不过我有一个问题,我只是复制并粘贴它只是为了进行测试运行,但我不断收到此错误(查看已编辑的 OP) (2认同)
  • @James:这至少需要Java 1.6(已经超过3年).在Java 1.6中引入了[`LinkedList#peekFirst()`](http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html#peekFirst%28%29)方法.升级JVM(JDK)或将IDE(Eclipse?)配置为Java 6合规模式. (2认同)

sbl*_*ndy 10

这被称为屏幕抓取,维基百科有关于更具体的网络抓取的这篇文章.这可能是一个重大的挑战,因为那里有一些丑陋的,搞乱的,破碎的,如果不是浏览器聪明的HTML,那么好运.


mdm*_*dma 6

我会使用JTidy - 它与JSoup相似,但我不熟悉JSoup.JTidy处理破碎HTML并返回一个W3C文档,这样你就可以以此为源,以XSLT来提取你真正感兴趣的内容.如果你不知道XSLT,那么你不妨用JSoup去,作为文档模型比w3c更好用.

编辑:快速浏览一下JSoup网站,可以看出JSoup确实是更好的选择.它似乎支持CSS选择器开箱即可从文档中提取内容.与进入XSLT相比,这可能更容易使用.