Jsoup没有返回HTML页面中的所有div

时间:2016-03-15 19:43:54

标签: java http automation web-scraping jsoup

我正在尝试解析网页padalvarigal.com以获取页面中所有结果的网址(以绿色突出显示)。但是当我使用Jsoup解析网页时,我在打印doc对象时没有得到整个div。 div id“hits”中的网址和标题也会被我在控制台{{3}中打印的doc对象中的“{{{{{}}}”,“{{{Title}}}”替换}。在实际页面IDE screen shot中也有6个带有类名的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的新手,我正在尝试学习个人项目的框架。

2 个答案:

答案 0 :(得分:2)

您无需使用jsoup来获取此网站的搜索结果。

如果您查看Chrome开发者工具的“网络”标签,则可以看到在加载网页时,POSTan endpoint具有特定的JSON内容:

{"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开发工具的屏幕截图: enter image description here

所以你需要的只是:

  1. 使用修改后的正文发送POST请求到端点(到 适合您的查询)(Sending HTTP POST Request In Java)并获得回复,这是一个JSON。
  2. 解析JSON结果以获得所需内容 (How to parse JSON in Java

答案 1 :(得分:1)

使用 Firebug 开发人员工具查看页面的来源,但是旧的权利 - 点击 - &gt;查看来源

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

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