【问题标题】:Reading HTML from URL in Java vs. Python从 Java 与 Python 中的 URL 读取 HTML
【发布时间】:2019-02-26 05:56:37
【问题描述】:

我正在尝试从特定 URL 读取 HTML 并将其存储到字符串中以进行解析。我提到了previous post 来帮助我。当我打印出阅读的内容时,我得到的只是特殊字符。

这是我从 URL 读取并打印的 Java 代码(省略了 try/catch):

String path = "https://html1-f.scribdassets.com/913q5pjrsw60h9i4/pages/106-6b1bd15200.jsonp";
URL url = new URL(path);
InputStream in = url.openStream();

BufferedReader bw = new BufferedReader(new InputStreamReader(in, "UTF-8");

String line;            
while ((line = bw.readLine()) != null) {
    System.out.println(line);
}

程序输出:

�ĘY106-6b1bd15200.jsonpmP�r� �Ƨ�!�%m�vD"��Ra*��w�%����ݳ�sβ��MK�d�9+%�m��l^��މ����:����  ���8B�Vce�.A*��x$FCo���a�b�<����Xy��m�c�>t����� �Z������Gx�o�   �J���oKe�0�5�kGYpb�*l����+|�U���-�N3��jBp�R�z5Cۥjh��o�;�~)����~��)~ɮhy��<c,=;tHW���'�c�=~�w���

预期输出:

window.page106_callback(["<div class=\"newpage\" id=\"page106\" style=\"width: 902px; height:1273px\">\n<div class=image_layer style=\"z-index: 1\">\n<div class=ie_fix>\n<img class=\"absimg\" style=\"left:18px;top:27px;width:860px;height:1077px;clip:rect(1px 859px 1076px 1px)\" orig=\"http://html.scribd.com/913q5pjrsw60h9i4/images/106-6b1bd15200.jpg\"/>\n</div>\n</div>\n</div>\n\n"]);

起初,我认为这是权限问题或以某种方式加密流的问题,但我的朋友编写了一个小的 Python 脚本来做同样的事情并且它有效,从而排除了这种情况。这是他写的:

import requests

link = 'https://html1-f.scribdassets.com/913q5pjrsw60h9i4/pages/106- 
6b1bd15200.jsonp'
f = requests.get(link)
text = (f.text)
print(text)

所以问题是,为什么 Java 版本无法从这个特定的 URL 正确读取和打印?请注意,我尝试测试了来自不同网站的其他一些 URL,并且效果很好。也许我应该学习 Python。

【问题讨论】:

  • 无论是什么语言,返回的都是 javascript,而不是 HTML。
  • 我想我假设 InputStream 在给定的 URL 处包含页面的 HTML。流中是否包含 JavaScript 或嵌入在 HTML 中的 JavaScript 对我来说没有区别。

标签: java python url web-scraping


【解决方案1】:

响应是 gzip 编码的。你可以这样做:

        InputStream in = new GZIPInputStream(con.getInputStream());

【讨论】:

  • 谢谢,工作就像一个魅力!这是因为您在上面的评论中提到它是返回的 JavaScript 吗?还是网站决定对其流进行编码?
  • @Wishcle 响应中有两个标头:Content-Type: application/x-javascriptContent-Encoding: gzip。 gzip 编码可以是 http 引擎 (nginx) 中的默认编码。
【解决方案2】:

@Maurice Perry 是对的,我用下面的代码试过了

String url = "https://html1-f.scribdassets.com/913q5pjrsw60h9i4/pages/106-6b1bd15200.jsonp";

URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();

BufferedReader in = new BufferedReader(
        new InputStreamReader(new GZIPInputStream(con.getInputStream())));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

System.out.println(response.toString());

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多