我正在为在线游戏创建一个 discord 机器人,其中一个机器人的功能是使用网络爬虫获取项目信息。
我的问题是,当我使用 UTF-8 编码的 URL 时,Jsoup 出于某种原因不起作用。
我确实尝试遍历所有具有相同类名的元素,但这根本不起作用。看起来那里完全没有类(class)。
String url = "http://coryn.club/item.php?name=";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(arguments.get(0));
for (int i = 1; i < arguments.size(); i++)
stringBuilder.append(" ").append(arguments.get(i));
url = url + URLEncoder.encode(stringBuilder.toString(), "UTF-8");
System.out.println(url);
Document document = Jsoup.connect(url).get();
Element table = document.getElementsByClass("table table-striped").first();
System.out.println(table == null ? "Table is null" : "Table is not null"); //returns that the table is null only on the %27 link
例如,网址:http://coryn.club/item.php?name=dark+general完全可以,但是 url http://coryn.club/item.php?name=dark+general%27s将不会。唯一的区别是接近尾声的 %27。
我确实得到了“table table-striped”类元素的空值。
请注意,我在两个 URL 中使用了相同的代码,但只有第一个有效。
另请注意,如果您确实在浏览器中打开该页面,它将正常工作,并且您仍然会看到带有 inspect 元素的 HTML 数据。
最佳答案
看起来如果你使用像
这样的原始(未编码)查询数据String url = "http://coryn.club/item.php?name=dark general's";
你会得到正确的结果。
这表明 Jsoup 自己对这些参数进行编码,这意味着如果您使用 dark+general%27s
形式的数据它将再次编码,导致最终 URL 包含 dark%2Bgeneral%2527s
.
因为服务器在解码后会看到 name
的值作为dark+general%27s
不是 dark general's
并将搜索但找不到匹配它的结果。因此,返回的 HTML 中将没有结果表。
所以不要对您的数据进行编码,让 Jsoup 为您完成。
顺便说一句:您还可以将代码更改为更具 (IMO) 可读性的版本
Document document = Jsoup
.connect("http://coryn.club/item.php")
.data("name", stringBuilder.toString()) //query parameters - don't encode manually
.get();
注意 stringBuilder.toString()
不是我们编码的,它包含像dark general's
这样的原始数据.
顺便说一句 2:如果 arguments
被定义为包含类似字符串的 CharacterSequence,例如 List<String>
因为 Java 8 而不是
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(arguments.get(0));
for (int i = 1; i < arguments.size(); i++)
stringBuilder.append(" ").append(arguments.get(i));
你可以使用
String joined = String.join(" ", arguments);
或
String joined = arguments.stream().collect(Collectors.joining(" "));
更多信息:Java equivalent of PHP's implode(',' , array_filter( array () ))
关于java - Jsoup 不能正常处理包含非字母字符的编码链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56298814/