2016-10-27 6 views
1

Я использую jsoup для синтаксического анализа всех ссылок URL из файла Строка, которая работает хорошо.Jsoup: parse url links отдельно

Часть строки содержимого с URLs, как вы видите ссылки представлены после текста «Инструкции по загрузке:», «Зеркало:» и «Дополнительно:»:

<u>Download Instructions:</u><br/> 
<a class="postlink" href="https://test.com/info">https://test.com/info</a> 
<br/>Mirror:<br/> 
<a class="postlink" href="http://global.eu/navi.html">http://global.eu/navi.html</a> 
<br/>Additional:<br/> 
<a class="postlink" href="http://main.org/navi.html">http://main.org/navi.html</a> 

Теперь моя цель для синтаксического анализа всех URL-адресов (может быть несколько) после текста «Инструкции по загрузке:« и текст «Зеркало:»отдельно, URL-адреса после «Дополнительные» должны игнорироваться.

Ниже всего лишь фрагментирует их все и добавляет их в (url) arraylist.

int j = 0; 
Document doc = Jsoup.parse(content); 
Elements links = doc.select("a.postlink"); 
for (Element el : links) { 
    String urlman = el.attr("abs:href"); 
    if (urlman != null) { 
     url.add(j, urlman); 
     j++; 
    } 
} 

Было бы здорово, если бы кто-нибудь мог помочь.

Заранее спасибо.

ответ

1

Основываясь на вашей размещенной структуре, вы можете проверить предыдущие узлы сестры, чтобы найти узел (здесь либо #text, либо тег <u>), который описывает привязки. Затем просто выполните некоторую форму сравнения строк.

Пример кода

String source = "<u>Download Instructions:</u><br/><a class=\"postlink\" href=\"https://1test.com/info\">https://test.com/info</a><br/><a class=\"postlink\" href=\"https://2test.com/info\">https://test.com/info</a><br/><a class=\"postlink\" href=\"https://3test.com/info\">https://test.com/info</a><br/>Mirror:<br/><a class=\"postlink\" href=\"http://global.eu/navi1.html\">http://global.eu/navi.html</a><br/><a class=\"postlink\" href=\"http://global.eu/navi2.html\">http://global.eu/navi.html</a><br/>Additional:<br/><a class=\"postlink\" href=\"http://main.org/navi.html\">http://main.org/navi.html</a>"; 

Document doc = Jsoup.parse(source, "UTF-8"); 

List<String> downloadInstructionsUrls = new ArrayList<>(); 
List<String> mirrorUrls = new ArrayList<>(); 

for (Element el : doc.select("a.postlink")) { 
    Node previousSibling = el.previousSibling(); 

    while(!(previousSibling.nodeName().equals("u") || previousSibling.nodeName().equals("#text"))){ 
     previousSibling = previousSibling.previousSibling(); 
    } 

    String identifier = previousSibling.toString(); 

    if(identifier.contains("Download Instructions")){ 
     downloadInstructionsUrls.add(el.attr("abs:href")); 
    }else if(identifier.toString().contains("Mirror")){ 
     mirrorUrls.add(el.attr("abs:href")); 
    } 
} 

System.out.println("Url for download instructions:"); 
downloadInstructionsUrls.forEach(url -> {System.out.println("\t"+url);}); 
System.out.println("Url for mirror:"); 
mirrorUrls.forEach(url -> {System.out.println("\t"+url);}); 

Выход

Url for download instructions: 
    https://1test.com/info 
    https://2test.com/info 
    https://3test.com/info 
Url for mirror: 
    http://global.eu/navi1.html 
    http://global.eu/navi2.html 
+0

Это великий Фредерик, многие ТНХ для ваших усилий. – Simon

+0

@Simon Часть «может быть несколько» еще не выполнена, опубликует обновление через минуту или две. –

+0

Thx заранее. – Simon