Получение абсолютного URL с веб-страницы
Я хочу извлечь полную ссылку из файла HTML. Полная ссылка Я имею в виду абсолютные ссылки. Я использовал Тика для этой цели. Вот мой код:
URL url = new URL("http://www.domainname.com/");
InputStream input = url.openStream();
LinkContentHandler linkHandler = new LinkContentHandler();
ContentHandler textHandler = new BodyContentHandler();
ToHTMLContentHandler toHTMLHandler = new ToHTMLContentHandler();
TeeContentHandler teeHandler = new TeeContentHandler(linkHandler,
textHandler, toHTMLHandler);
Metadata metadata = new Metadata();
ParseContext parseContext = new ParseContext();
HtmlParser parser = new HtmlParser();
parser.parse(input, teeHandler, metadata, parseContext);
System.out.println("title:\n" + metadata.get("title"));
for (Link link : linkHandler.getLinks()) {
System.out.println(link.getUri());
}
Это дает мне относительный URL-адрес, например /index.html или documents/US/economicreport.html, но абсолютный URL-адрес в этом случае - http://domainname.com/index.html.
Как я могу получить все ссылки правильно означает полную ссылку, включая доменное имя? Как я могу сделать это на Java?
2 ответа
Если вы сохранили URL-адрес базового веб-сайта в URL, должно работать следующее:
URL url = new URL("http://www.domainname.com/");
String givenUrl = ""; //This is the parsed address
if (givenUrl.charAt(0) == '/') {
String absoluteUrl = url + givenURL;
} else {
String absoluteUrl = givenUrl;
}
Чуть лучше предыдущего, но ненамного
URL targetDocumentUrl = new URL("http://www.domainname.com/content.html");
String parsedUrl = link.getURI();
String absoluteLink = new URL(targetDocumentUrl, parsedURL);
Тем не менее, это все еще не хорошее решение, поскольку возникают проблемы, когда html-документ имеет следующую теговую базу href="/", а анализируемая ссылка является относительной и начинается с "../".
Конечно, вы можете обойти это несколькими способами, но они требуют небольшой работы, такой как реализация ContentHandler. Я должен думать о чем-то настолько простом, что должен быть простой способ сделать это с помощью Tika LinkContentHandler.