我正在为在线游戏创建一个不和谐机器人,并且该机器人的功能之一是使用网络爬虫来获取商品信息。
我的问题是,当我使用UTF-8编码的URL时,由于某些原因Jsoup无法正常工作。
我确实尝试遍历具有相同类名的所有元素,但这根本不起作用。看来该堂课完全缺了。
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
例如,URL: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数据。
答案 0 :(得分:3)
如果您使用原始的(未编码的)查询数据(如
),String url = "http://coryn.club/item.php?name=dark general's";
您将获得正确的结果。
这表明Jsoup自行对这些参数进行编码,这意味着,如果您使用dark+general%27s
格式的数据,它将再次被编码,从而导致最终URL包含dark%2Bgeneral%2527s
。由于该服务器在解码后将其视为数据dark+general%27s
,也就是name
,因此它将搜索并找不到导致返回的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
之类的原始数据。
顺便说一句,如果arguments
被定义为包含String之类的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 () ))