java - Jsoup 不能正常处理包含非字母字符的编码链接

标签 java jsoup

我正在为在线游戏创建一个 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/

相关文章:

java - liquibase 中的 CLOB 类型转变为 SQL Server 中的 VARCHAR

java - Spring Data JDBC是否支持自定义类型转换器

java - 将消息传递给jsp(struts2)

java - 无法在 Mac OS X Mavericks 中正确安装 Eclipse

java - Jsoup select 似乎不适用于 Android

java - 带有负载的 Jsoup HTTP POST

Java-Jsoup,抓取 html

Java jsoup 链接提取

java - jsoup 登录网站

java - 动态更改 draw2d 图形的工具提示