2

我试图构建一个从网站收集 HTML 源代码的爬虫,我在 .csv 文件中有这些源代码。每当我将链接放入时,一切似乎都运行良好

url = new URL ("http://example.com")

但是每当我尝试将链接放在一个变量中(本例中为“文本”)时,我都会收到一个错误,告诉我有一个 malformedURLException。

这是我的代码:

String text ="http://stackoverflow.com/questions/9827143/continuing-execution-after-an-exception-is-thrown-in-java";

// get the sourcecode of the link you just grabbed
url = new URL(text);
PrintWriter writer = new PrintWriter("sourcecode.txt", "UTF-8");
4

3 回答 3

2

您的字符串中有隐藏的字符。您可能从 Word 文件或在 Windows 中转换的文本文件复制了 URL。在它的开头有一个 BOM 标记。当我这样做时:

System.out.println( Arrays.toString(text.getBytes(StandardCharsets.UTF_16BE)));

这是我得到的输出:

[-2, -1, 0, 104, 0, 116, 0, 116, 0, 112, 0, 58, 0, 47, 0, 47, 0, 115, 0, 116, 0, 97, 0, 99 , 0, 107, 0, 111, 0, 118, 0, 101, 0, 114, 0, 102, 0, 108, 0, 111, 0, 119, 0, 46, 0, 99, 0, 111, 0 , 109, 0, 47, 0, 113, 0, 117, 0, 101, 0, 115, 0, 116, 0, 105, 0, 111, 0, 110, 0, 115, 0, 47, 0, 57 , 0, 56, 0, 50, 0, 55, 0, 49, 0, 52, 0, 51, 0, 47, 0, 99, 0, 111, 0, 110, 0, 116, 0, 105, 0 , 110, 0, 117, 0, 105, 0, 110, 0, 103, 0, 45, 0, 101, 0, 120, 0, 101, 0, 99, 0, 117, 0, 116, 0, 105 , 0, 111, 0, 110, 0, 45, 0, 97, 0, 102, 0, 116, 0, 101, 0, 114, 0, 45, 0, 97, 0, 110, 0, 45, 0 , 101, 0, 120, 0, 99, 0, 101, 0, 112, 0, 116, 0, 105, 0, 111, 0, 110, 0, 45, 0, 105, 0, 115, 0, 45 , 0, 116, 0, 104, 0, 114, 0, 111, 0, 119, 0, 110, 0, 45, 0, 105, 0, 110, 0, 45, 0, 106, 0, 97, 0 , 118, 0, 97]

前两个字节是 unicode BOM 字符。小心你从哪里得到你的字符串。如果您从 Excel 导出 CSV,并且文件仅包含 URL,请尝试仅将其导出为 ASCII。

于 2015-06-01T20:43:42.803 回答
0

你的双引号有问题。

我将您的“文本”行粘贴到 Eclipse 中并尝试保存,它向我显示“文本”字符串的开头有一个无效字符,因为有一个 Cp1252 编码字符。

我删除了你的第一个双引号,然后重新输入。然后我跑了

String text = "http://stackoverflow.com/questions/9827143/continuing-execution-after-an-exception-is-thrown-in-java";

try {
    URL url = new URL(text);
    PrintWriter writer = new PrintWriter("sourcecode.txt", "UTF-8");
    System.out.println("all good");
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

它奏效了。

于 2015-06-01T20:40:09.537 回答
0

您的文本变量中有一个特殊的字符。刚刚在浏览器中尝试了您的链接,因此它不起作用。

复制以下内容并重试:

​String text ="http://stackoverflow.com/questions/9827143/continuing-execution-after-an-exception-is-thrown-in-java";
于 2015-06-01T20:43:49.787 回答