【问题标题】:Jsoup not returning all the divs in the HTML pageJsoup 不返回 HTML 页面中的所有 div
【发布时间】:2016-03-15 19:43:53
【问题描述】:

我正在尝试解析网页 padalvarigal.com 以获取页面中所有结果的 URL(以绿色突出显示)。但是当我使用 Jsoup 解析网页时,我在打印 doc 对象时没有得到整个 div。 div id "hits" 中的 URL 和标题也被替换为我在 console 中打印的 doc 对象中的 "{{{URL}}}"、"{{{Title}}}"。在实际页面 中,在六个类名命中的 div 中,我在解析页面中只得到一个名为 hit 的 div。

我也尝试将 maxBodySize() 设置为 0 以获取整个网页结果,但仍然遇到同样的问题。请指导我出了什么问题。

package com.balaji.parse;
import org.jsoup.Jsoup;
import org.jsoup.Connection;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ParseHTML {
    private static final String URL = "http://www.paadalvarigal.com/search/?q=naanum%20rowdythan";
    public static void main(String args[]) {
        //parseFromString();
        parseFromHTML();
    }

    private static void parseFromString() {
        String html = "<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>";

        Document doc = Jsoup.parse(html);
        System.out.println(doc.head());
        System.out.println(doc.title());
        System.out.println(doc.body());
        //To Parse only body tag and elements - adds HTML and Body tags.
        System.out.println("Parsing only Body");
        Document doc2 = Jsoup.parseBodyFragment(html);
        System.out.println(doc2);
    }

    private static void parseFromHTML() {
        try {
            Connection con = Jsoup.connect(URL);
            con.timeout(5000);
            con.header("Accept-Encoding", "gzip, deflate");
            con.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0");
            con.maxBodySize(0);

            Document doc = con.get();
            System.out.println(doc.head());
            System.out.println(doc.title());
            System.out.println(doc);

        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

P.S:我是 JSoup 的新手,我正在努力学习个人项目的框架。

【问题讨论】:

    标签: java http automation web-scraping jsoup


    【解决方案1】:

    您不需要使用 jsoup 来获取该网站的搜索结果。

    如果您查看 Chrome 开发者工具的“网络”选项卡,您会看到当您加载页面时,带有特定 JSON 内容的 POSTan endpoint

    {"requests":[{"indexName":"song","params":"query=naanum%20rowdythan&hitsPerPage=7&maxValuesPerFacet=7&page=0&facets=%5B%22singers%22%2C%22Lyrics%20By%22%2C%22Music%20By%22%2C%22Singers%22%5D&tagFilters="}]}
    

    您可以看到 q=naanum%20rowdythan 是 JSON 的一部分。

    这是您将得到的响应:

    {
      "results": [
        {
          "hits": [
            {
              "Title": "Varavaa Varavaa",
              "Movie": "Naanum Rowdydhaan",
              "Lyrics By": [
                "Vignesh Shivan"
              ],
              "Music By": [
                "Anirudh"
              ],
              "Singers": [
                "Anirudh Ravichander",
                "Vignesh Shivan"
              ],
              "Img": "http://www.paadalvarigal.com/wp-content/uploads//NaanumRowdydhaan-70x53.jpg",
              "URL": "http://www.paadalvarigal.com/3598/varavaa-varavaa-naanum-rowdydhaan-song-lyrics.html",
              "objectID": "3598",
              "_highlightResult": {
                "Title": {
                  "value": "Varavaa Varavaa",
                  "matchLevel": "none",
                  "matchedWords": []
                },
                "Movie": {
                  "value": "<em>Naanum</em> <em>Rowdydhaa</em>n",
                  "matchLevel": "full",
                  "matchedWords": [
                    "naanum",
                    "rowdythan"
                  ]
                }
              }
            },
    

    这是 Chrome 开发工具的屏幕截图:

    所以你只需要:

    1. 发送一个 POST 请求到带有修改后正文的端点(到 适应您的查询)(Sending HTTP POST Request In Java) 并返回 JSON 响应。
    2. 解析 JSON 结果得到你需要的 (How to parse JSON in Java)

    【讨论】:

    • 谢谢。让我尝试实施您的建议。
    【解决方案2】:

    查看页面的源代码,不是使用 Firebug开发者工具,而是使用旧的正确-点击 -> 查看源代码

    源应该与您的 Jsoup 输出相匹配。似乎有一个脚本(由页面加载)用真实数据替换 {{URL}},{{Title}}, ... 模板。

    Jsoup不会为您执行此操作 - 它不会执行任何客户端脚本。您将不得不找到其他方法来获取数据。通过一点点挖掘,您可能会在加载的脚本中找到一些东西。

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多