java - 解析网页

标签 java html css

我想解析一个网站并从中获取一些信息。问题是,当我用java加载页面并将其保存到文件中时,它不包含我需要的信息。当我单击页面上的“查看源代码”时,也没有任何信息。但是,当我下载页面(另存为)并用记事本打开它时,我能够找到我需要的内容。

简而言之,java 加载的网页与我下载并用记事本打开的网页不同。

如何将页面加载到字符串中,使其看起来与我在计算机上下载的页面相同?

public static void main(String[] args) {

    try {
        String webPage = "http://www.integral-calculator.com/#";
        URL url = new URL(webPage);
        URLConnection urlConnection = url.openConnection();
        InputStream is = urlConnection.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);

        int numCharsRead;
        char[] charArray = new char[1024];
        StringBuffer sb = new StringBuffer();
        while ((numCharsRead = isr.read(charArray)) > 0) {
            sb.append(charArray, 0, numCharsRead);
        }
        String result = sb.toString();

        PrintWriter out = new PrintWriter("C:\\Users\\Patryk\\Desktop\\filename.txt");
        out.println(result);
        out.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

最佳答案

浏览器加载起始页后,例如index.html,它将尝试加载和解析更多内容:CSS 文件、Javascript 文件、多媒体文件等。然后,当事件被触发时,所有 JavaScript 都会运行并可能加载更多内容。

因此可以想象,大部分网页内容都是在第二步中加载的。如果您像在代码片段中那样仅下载带有 URLConnection 的起始页,则您只会收到第一个启动帧,而没有其他内容。

如果您考虑一下这一点,您就会意识到一个简单的 URLConnection 与浏览器的强大行为相去甚远。 HTTPClient 位于 URLConnection 和浏览器之间。对于所有这些级别,您都会发现 Java 库的行为或多或少复杂,因此获得的内容也或多或少。

在下面的线程中,提到了 Apache Java HTTPClient:

Equivallent of .NET's WebClient and HttpWebRequest in Java?

在这个线程中,提到了 Java HTMLUnit。它可以几乎完全加载网站并解析大量 Javascript:

Apache HttpClient 4 And JavaScript

如果您使用 HTMLUnit,您会找到下载大部分网页的方法,包括额外加载的内容。然后,您将看不到您抓取的网页或浏览器抓取的网页之间有太大差异。

--

另一种抓取网页的方法是在 shell 执行中使用 wget 命令。 wget 可以递归下载具有附加内容和文件结构的网站,并将它们存储到磁盘上。

只需打开 shell 并尝试 wget -E -H -k -K -p http://www.garfield.com。这将下载完整链接的哲学猫的内容。

关于java - 解析网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538302/

相关文章:

html - Bootstrap 。列表 + ScrollSpy。如何降低高度?

java - 暂停时如何访问VLC的耗时? - Java字幕字符串解析程序

java - 不确定为什么 Selenium 方法在 Main 中运行速度快,但在 JUnit 中运行速度慢

java - 获取通用基础存储库的参数类型名称

jquery - 禁用滚动的 div 之间的平滑过渡

javascript - 如何将 Div 相互环绕

javascript - 手动调用jquery mouseover函数

html - 仅在 Bootstrap 4 figure-img 中叠加

css - 在 React 的 Material-ui 上覆盖 TableRow 悬停 CSS

java - 运行 ADF Morena 应用程序时出错?