【问题标题】:JSOUP is not rendering complete htmlJSOUP 未呈现完整的 html
【发布时间】:2016-09-28 14:56:59
【问题描述】:

我正在尝试使用 JSOUP 渲染一个 URL 以读取一些参数,但发现它没有渲染完整的 HTML。

下面是我的代码

Document doc=Jsoup.connect("http://www.svbcgold.com/").get();
System.out.println("HTML.."+doc.html());

在此它只显示部分值而不是全部。在此页面中,我们有一些值,例如 GOLD、SILVER,但我无法在输出中看到它们,它仅将输出显示到表中。

请求您在这方面帮助我。

【问题讨论】:

  • 欢迎来到 Stack Overflow!您的问题陈述并不完全清楚 - 请edit 您的问题更完整地描述您预期会发生什么以及这与实际结果有何不同。请参阅 How to Ask 以获取有关什么是好的解释的提示。
  • 这个问题的答案是否完整?然后请选择最合适的答案或在 cmets 中发布后续问题(见stackoverflow.com/help/someone-answers

标签: jsoup


【解决方案1】:

我认为 Jsoup 没有解析您的整个文档。这就是为什么您无法获取所有内容或缺少某人的原因。试试这个:

Document doc = Jsoup.connect("http://www.svbcgold.com/").header("Accept-Encoding", "gzip, deflate").userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0").maxBodySize(0).timeout(0).get();
System.out.println("HTML.."+doc.html());

希望您的问题能够解决。

【讨论】:

  • 包含价格 (#LPriceTbl) 的表格是使用 javascript 生成和插入的,因此在使用 jsoup 解析时会丢失(不支持 javascript)。正如预期的那样,您的代码也缺少目标信息(表中的价格)。
【解决方案2】:

使用XMLHttpRequest,网站通过 JavaScript 请求当前价格。

在控制台(Chrome 开发者工具)中调用以下 JavaScript 代码会复制后台请求:

var xhr = new XMLHttpRequest();
xhr.open('post', 'http://www.svbcgold.com/LPriceSvbc.asmx/getSVBCPriceN', true);
xhr.setRequestHeader('Content-Type', "application/json");
xhr.send();

xhr.response 然后持有一个 JSON 对象,包含所有需要的信息:

"{"d":"[{\"BranchId\":9999,\"BranchDisplayName\":\"INTERNATIONAL\",\"BrPurityProductId\":9997,\"ProductDisplayName\":\"Gold\",\"PurityDisplayName\":\" \",\"ProductType\":\"U\",\"IsProductWeight\":0,\"LPrice\":\"1323.10\",\"TxtColor\":\"Black\"},{\"BranchId\":9999,\"BranchDisplayName\":\"INTERNATIONAL\",\"BrPurityProductId\":9998,\"ProductDisplayName\":\"Silver\",\"PurityDisplayName\":\"\",\"ProductType\":\"U\",\"IsProductWeight\":0,\"LPrice\":\"19.16\",\"TxtColor\":\"Black\"},{\"BranchId\":9999,\"BranchDisplayName\":\"INTERNATIONAL\",\"BrPurityProductId\":9999,\"ProductDisplayName\":\"USD/INR\",\"PurityDisplayName\":\" \",\"ProductType\":\"U\",\"IsProductWeight\":0,\"LPrice\":\"66.41\",\"TxtColor\":\"Black\"},{\"BranchId\":1,\"BranchDisplayName\":\"VISAKHAPATNAM\",\"BrPurityProductId\":1,\"ProductDisplayName\":\"Spot Gold 100g\",\"PurityDisplayName\":\"999\",\"ProductType\":\"G\",\"IsProductWeight\":0,\"LPrice\":\"315040\",\"TxtColor\":\"Black\"},{\"BranchId\":2,\"BranchDisplayName\":\"VIJAYAWADA\",\"BrPurityProductId\":2,\"ProductDisplayName\":\"Spot Gold 100g\",\"PurityDisplayName\":\"999\",\"ProductType\":\"G\",\"IsProductWeight\":0,\"LPrice\":\"315040\",\"TxtColor\":\"Black\"},{\"BranchId\":3,\"BranchDisplayName\":\"HYDERABAD\",\"BrPurityProductId\":3,\"ProductDisplayName\":\"Spot Gold 100g\",\"PurityDisplayName\":\"999\",\"ProductType\":\"G\",\"IsProductWeight\":0,\"LPrice\":\"315040\",\"TxtColor\":\"Black\"},{\"BranchId\":1,\"BranchDisplayName\":\"VISAKHAPATNAM\",\"BrPurityProductId\":1,\"ProductDisplayName\":\"Spot Silver 1kg\",\"PurityDisplayName\":\"999\",\"ProductType\":\"S\",\"IsProductWeight\":0,\"LPrice\":\"N/A\",\"TxtColor\":\"Red\"},{\"BranchId\":2,\"BranchDisplayName\":\"VIJAYAWADA\",\"BrPurityProductId\":2,\"ProductDisplayName\":\"Spot Silver 1kg\",\"PurityDisplayName\":\"999\",\"ProductType\":\"S\",\"IsProductWeight\":0,\"LPrice\":\"N/A\",\"TxtColor\":\"Red\"},{\"BranchId\":3,\"BranchDisplayName\":\"HYDERABAD\",\"BrPurityProductId\":3,\"ProductDisplayName\":\"Spot Silver 1kg\",\"PurityDisplayName\":\"999\",\"ProductType\":\"S\",\"IsProductWeight\":0,\"LPrice\":\"N/A\",\"TxtColor\":\"Red\"}]"}"

在 Java 中,我们可以使用 java.net.HttpURLConnection 来处理请求,并使用 JSON 解析器(如 JSON.simple)来解析响应。

Java 代码示例

try {
    String url = "http://www.svbcgold.com/LPriceSvbc.asmx/getSVBCPriceN";
    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "application/json;charset=utf-8");
    con.setDoOutput(true);

    con.connect();
    OutputStream os = new BufferedOutputStream(con.getOutputStream());
    os.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String response = in.readLine();
    in.close();

    // parse the response
    JSONObject jsonObject = (JSONObject) new JSONParser().parse(response);
    JSONArray jsonArray = (JSONArray) new JSONParser().parse((String)jsonObject.get("d"));

    for (Object object : jsonArray) {
        jsonObject = (JSONObject)object;
        System.out.println(jsonObject.get("BranchDisplayName") + "\n\t" + jsonObject.get("ProductDisplayName") + " " + jsonObject.get("PurityDisplayName") + " " + jsonObject.get("LPrice"));
    }

} catch (IOException | ParseException e) {
    e.printStackTrace();
}

输出

INTERNATIONAL
    Gold   1323.10
INTERNATIONAL
    Silver  19.16
INTERNATIONAL
    USD/INR   66.41
VISAKHAPATNAM
    Spot Gold 100g 999 315040
VIJAYAWADA
    Spot Gold 100g 999 315040
HYDERABAD
    Spot Gold 100g 999 315040
VISAKHAPATNAM
    Spot Silver 1kg 999 N/A
VIJAYAWADA
    Spot Silver 1kg 999 N/A
HYDERABAD
    Spot Silver 1kg 999 N/A 

【讨论】:

    【解决方案3】:

    在 Chrome 中打开此网站,同时打开您的开发工具。您会看到它会在页面已呈现后发出异步请求以加载其他数据。

    Jsoup 只解析初始响应。它不是 JavaScript 驱动的网站的正确工具。您可能需要将 htmlunit 之类的东西与 PhantomJS 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 2016-11-19
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多