2015-03-26 2 views
1

Я пытаюсь получить ссылки на веб-сайте и разместить их на List, но я постоянно получаю неполные ссылки без корневого сайта. Например, я получаю что-то вроде /thing.html/ вместо http://website.com/thing.html/Как получить полную/абсолютную ссылку из тега HREF с помощью javax.swing.text.html?

Он предназначен для поисковой системы, поэтому мне нужно также разобрать ссылки на сайт, и для этого мне нужна полная ссылка.

Мне также не разрешено использовать какую-либо третью библиотеку, такую ​​как JSoup, и именно поэтому я использую javax.swing.text.html, чтобы сделать это.

Я думаю, что вы можете сделать что-то вроде anchor.attr("abs:href") с помощью Jsoup, это то же самое, что мне нужно здесь.

Вот код, который я до сих пор:

import java.util.List; 
import java.util.ArrayList; 
import java.net.*; 
import java.io.*; 

import javax.swing.text.html.parser.ParserDelegator; 
import javax.swing.text.html.HTMLEditorKit.ParserCallback; 
import javax.swing.text.html.HTML.Tag; 
import javax.swing.text.html.HTML.Attribute; 
import javax.swing.text.MutableAttributeSet; 

public class PARSER { 

public static List<String> getLinks(BufferedReader BuffRead) throws IOException { 
final ArrayList<String> list = new ArrayList(); 

ParserDelegator parserDelegator = new ParserDelegator(); 
ParserCallback parserCallback = new ParserCallback() { 
    public void handleText(final char[] data, final int pos) { } 
    public void handleStartTag(Tag tag, MutableAttributeSet attribute, int pos) { 
    if (tag == Tag.A) { 
     String address = (String) attribute.getAttribute(Attribute.HREF); 
       //This is where I get the HREF "links" 
     list.add(address); 
    } 
    } 
    public void handleEndTag(Tag t, final int pos) { } 
    public void handleSimpleTag(Tag t, MutableAttributeSet a, final int pos) { } 
    public void handleComment(final char[] data, final int pos) { } 
    public void handleError(final java.lang.String errMsg, final int pos) { } 
}; 
parserDelegator.parse(BuffRead, parserCallback, false); 
return list; 
} 

ответ

1

Первое: Рассмотрим не писать свои имена классов в заглавных букв Parser или MyParser с стартовым капиталом достаточно;)

Если вы только сканирование одного веб-сайта, вероятно, довольно относительные ссылки для поиска. Общепринято использовать их внутренне, и для относительных связей результаты, которые вы получаете, являются правильными. Знаете ли вы, что на веб-сайте, который вы разбираете, есть внешние ссылки?

Я не знаю, в какой среде вы вызываете свой Parser, но если вы просто позвоните Parser.getLinks(someBuffer) без знания веб-сайта, который вы разбираете, вы просто остаетесь со ссылками, которые вы найдете. Если вы разбираете онлайн-сайты, можете просто добавить базовый url. Так как вы знаете, на каком сайте вы находитесь прямо сейчас, вы можете передать URL и добавить его в относительной ссылке:

methodInterface будет выглядеть, что

public static List<String> getLinks(BufferedReader BuffRead, String baseUrl) throws IOException 

А вы бы проверить для относительных ссылок с чем-то как это (это очень просто)

if (tag == Tag.A) { 
    String address = (String) attribute.getAttribute(Attribute.HREF); 
    //if(!address.startsWith("http")) should work too as a primitive absolute link 
    //often starts with "http" as protocol 
    if(address.startsWith("/")||address.startsWith("..")){ 
    address = baseUrl + address; 
    } 
    list.add(address); 
} 

Привет

+0

большое спасибо! – BlindHouse

Смежные вопросы