【问题标题】:InputStreamReader on a URL connection returning nullURL 连接上的 InputStreamReader 返回 null
【发布时间】:2018-01-19 01:33:39
【问题描述】:

我正在关注“Web Scraping with Java”一书中关于网络抓取的教程。下面的代码给了我一个 nullPointerExcpetion。部分问题是(line = in.readLine()) 始终为空,因此第 33 行的 while 循环永远不会运行。我不知道为什么它总是为空。谁能提供我对此的见解?这段代码应该打印出关于 CPython 的维基百科文章的第一段。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.*;
import java.io.*;

public class WikiScraper {
    public static void main(String[] args) {
        scrapeTopic("/wiki/CPython");
    }
    public static void scrapeTopic(String url){
        String html = getUrl("http://www.wikipedia.org/"+url);
        Document doc = Jsoup.parse(html);
        String contentText = doc.select("#mw-content-text > p").first().text();
        System.out.println(contentText);
    }
    public static String getUrl(String url){
        URL urlObj = null;
        try{
            urlObj = new URL(url);
        }
        catch(MalformedURLException e){
            System.out.println("The url was malformed!");
            return "";
        }
        URLConnection urlCon = null;
        BufferedReader in = null;
        String outputText = "";
        try{
            urlCon = urlObj.openConnection();
            in = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));
            String line = "";
            while((line = in.readLine()) != null){
                outputText += line;
            }
            in.close();
        }catch(IOException e){
            System.out.println("There was an error connecting to the URL");
            return "";
        }
        return outputText;
    }
}

【问题讨论】:

  • 因为这个问题被否决了,有没有办法让这个问题更清楚?我试图弄清楚如何使 in.readline() 命令返回 null 以外的内容,并且不知道如何进一步解释我的问题,除了整个程序的结果应该是维基百科文章的第一段在 CPython 上。
  • 'InputStreamReader` 不返回 null。 BufferedReader.readLine() 确实如此,原因已记录在案。不清楚你在问什么。

标签: java url jsoup bufferedreader inputstreamreader


【解决方案1】:

如果你在浏览器中输入http://www.wikipedia.org//wiki/CPython,它会被重定向到https://en.wikipedia.org/wiki/CPython,所以

使用String html = getUrl("https://en.wikipedia.org/"+url);

改为String html = getUrl("http://www.wikipedia.org/"+url);

那么line = in.readLine()真的可以读到一些东西。

【讨论】:

  • 谢谢,看来 doc 已分配给一些有意义的 html 代码,但我仍然在 String contentText = doc.select("#mw-content-text > p").first().text(); 行收到空指针异常
  • 你能告诉我(doc.select("#mw-content-text > p") 行是如何工作的吗,因为我认为这是返回 null 的部分。
  • 或者特别是"#mw-content-text > p" 部分
  • doc.select("#mw-content-text > p) 表示选择 p 个元素,它们是 CSS id mw-content-text 的元素的子元素。可以通过浏览器查看en.wikipedia.org/wiki/CPython的源代码,因为元素mw-content-text没有子元素,doc.select("#mw-content-text > p) 返回NULL。
  • @Jacob "Web Scraping with Java",发布日期:2013 年 8 月 26 日,网页自发布之日起已更改,因此示例可能无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2014-12-29
  • 2015-10-04
  • 2015-02-03
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多