java - Jsoup 未返回 HTML 页面中的所有 div

标签 java http automation web-scraping jsoup

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

最佳答案

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

如果您查看 Chrome 开发者工具的“网络”选项卡,您可以看到加载页面时,POST 发送至 an 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)

关于java - Jsoup 未返回 HTML 页面中的所有 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020683/

相关文章:

java - 如何使用 Java 或 vbscript 对具有 SSO 身份验证的 URL 执行 HTTP POST?

python - 如何以编程方式创建和管理macOS Safari书签?

http - 如何在不安装代理的情况下使用 Zabbix 监控主机?

python - 使用 python Requests 库从 Twitter 的用户流中消费 - 如何检测断开连接?

java - Android 和 Dropbox 同步库

java - graphql-java 嵌套解析器在不同的线程中执行,具有不同的 Spring 安全上下文

rest - 如果用户想要对其个人资料和个人资料图片执行操作,客户端是否应该为 API 发送两个不同的 HTTP 请求

python - 让python在命令行中运行一个文件,输入一些东西,等待然后再次输入一些东西

java - Android 线程阻塞 UI 除非使用同步

java - 获取正确的正则表达式——Java