Как извлечь абсолютный 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?

2 14
url

2 ответа:

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

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

Вы можете кстати сократить select:

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

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"); с индексом вашего элемента. Или используйте select, который больше специфический, который приведет только к одному элементу.