Как извлечь абсолютный URL из относительных ссылок HTML с помощью Jsoup?

Я использую Jsoup для извлечения URL-адреса веб-страницы. Атрибут href для этих URL-адресов относителен как:

<a href="/text">example</a>

Вот моя попытка:

Document document = Jsoup.connect(url).get();
Elements results = document.select("div.results");
Elements dls = results.select("dl");
for (Element dl : dls) {
    String url = dl.select("a").attr("href");
}

Это отлично работает, но если я использую

String url = dl.select("a").attr("abs:href");

чтобы получить абсолютный URL-адрес, например http://example.com/text, он не работает. Как я могу получить абсолютный URL?

Ответы

Ответ 1

Вам нужно Element#absUrl().

String url = dl.select("a").absUrl("href");

Вы можете, кстати, сократить выбор:

Document document = Jsoup.connect(url).get();
Elements links = document.select("div.results dl a");
for (Element link : links) {
    String url = link.absUrl("href");
}

Ответ 2

String url = dl.select("a").absUrl("href");

Неправильно, потому что dl.select("a") не вернет ни одного элемента, кроме коллекции. Вам нужно получить элементы по индексу

например:

Elements elems = dl.select("a");
Element a1 = elems.get(0); //0 is the index first element increasing to (elems.size()-1)
now you can do
a1.absUrl("href");

Если вы уверены, что только один элемент будет получен в результате выбора выше, или что элемент, который вы хотите, будет первым, вы можете:

String url = dl.select("a").get(0).absUrl("href"); 

То же, что и

String url = dl.select("a").first().absUrl("href");

В любом случае он не должен быть первым элементом, вы всегда можете заменить 0 в String url = dl.select("a").get(0).absUrl("href"); с индексом вашего элемента. Или используйте более конкретный вариант, который приведет только к одному элементу.