Я пытаюсь получить доступ к URL-адресу в java, используя HTMLUnit. Способ работы веб-сайта заключается в том, что для результатов поиска на веб-сайте он сначала извлекает первую страницу результатов поиска, а затем переходит на выбранную страницу. То, что я хочу сделать, - это доступ к определенной странице, например, 21. URL должен иметь переменную, присоединенную к ней (например, http://www.thomsonlocal.com/Electricians/UK/#||25). Используя его в моем браузере, я получаю 25-ю страницу после загрузки первой страницы, а затем запускает метод (javascript или JQuery?)
Я попытался кодировать URL-адрес, чтобы избежать символа вертикальной строки, но возвращает страницу с ошибкой на сайте.
page = webClient.getPage("http://www.thomsonlocal.com/Electricians/UK/"+URLEncoder.encode("#||" , "UTF-8")+ 21);
Мой вопрос в том, что я делаю неправильно здесь? И есть ли способ узнать, какой метод используется для передачи переменных в URL?
Часть после #
является фрагментом URI. Он не подчиняется тем же правилам экранирования, что и данные формы, что и делает URLEncoder.encode()
(что означает, что он не работает для URL-адресов, вопреки распространенному мнению).
Здесь вы хотите создать шаблон URI (RFC 6570). Пример с использованием этой библиотеки:
public static void main(final String... args)
throws URITemplateException, MalformedURLException
{
final URITemplate template
= new URITemplate("http://www.thomsonlocal.com/Electricians/UK/#{+var}");
final VariableMap map = VariableMap.newBuilder()
.addScalarValue("var", "||25")
.freeze();
System.out.println(template.toURL(map));
}
Это будет (правильно) напечатать:
http://www.thomsonlocal.com/Electricians/UK/#%7C%7C25
Другим решением, хотя и не столь гибким, является использование конструктора URI:
final URI uri = new URI("http", "www.thomsonlocal.com",
"/Electricians/UK/", "||25");
System.out.println(uri.toURL());
Это также напечатает правильный результат.