如何使用javax.swing.text.html从HREF标签获取Full / Absolute链接?

时间:2015-03-26 08:12:32

标签: java html swing parsing href

我正在尝试获取网站中的链接,并将它们放在List上,但我经常会在没有根网站的情况下获得不完整的链接。例如,我得到/thing.html/而不是http://website.com/thing.html/

它应该是一个搜索引擎,所以我也需要解析网站的链接,我需要完整的链接才能做到这一点。

我也不允许使用任何第三方库,例如JSoup,这就是我使用javax.swing.text.html来实现这一目标的原因。

我认为你可以使用Jsoup做anchor.attr("abs:href")这样的事情,这就像我在这里需要的那样。

这是我到目前为止的代码:

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 个答案:

答案 0 :(得分:1)

首先:考虑不要在大写锁定ParserMyParser中写入您的班级名称,并且起始资金就足够了;)

如果您只抓取一个网站,可能会找到相当多的相关链接。在内部使用它们是常见的,并且对于相关链接,您获得的结果是正确的。您知道您正在解析的网站上有外部链接吗?

我不知道你在什么环境中称你的Parser,但如果你只是在不知道你正在解析的网站的情况下打电话给Parser.getLinks(someBuffer),你就会得到你找到的链接。如果您要解析在线网站,只需添加基本网址即可。既然您现在知道自己所在的网站,就可以传递网址并将其添加到相关链接中:

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);
}

问候