Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javax.swing.text.html从HREF标记获取完整/绝对链接?_Java_Html_Swing_Parsing_Href - Fatal编程技术网

如何使用javax.swing.text.html从HREF标记获取完整/绝对链接?

如何使用javax.swing.text.html从HREF标记获取完整/绝对链接?,java,html,swing,parsing,href,Java,Html,Swing,Parsing,Href,我试图获取网站中的链接,并将它们放在列表中,但我经常在没有根站点的情况下获取不完整的链接。例如,我得到了类似于/thing.html/的东西,而不是http://website.com/thing.html/ 它是一个搜索引擎,所以我也需要解析网站的链接,我需要完整的链接才能做到这一点 我也不允许使用任何第三方库,比如JSoup,这就是为什么我要使用javax.swing.text.html来实现这一点 我认为您可以使用Jsoup执行类似于anchor.attr(“abs:href”)的操作,这

我试图获取网站中的链接,并将它们放在
列表中
,但我经常在没有根站点的情况下获取不完整的链接。例如,我得到了类似于
/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;
}
import java.util.List;
导入java.util.ArrayList;
导入java.net。*;
导入java.io.*;
导入javax.swing.text.html.parser.ParserDelegator;
导入javax.swing.text.html.HTMLEditorKit.ParserCallback;
导入javax.swing.text.html.html.Tag;
导入javax.swing.text.html.html.Attribute;
导入javax.swing.text.MutableAttributeSet;
公共类解析器{
公共静态列表getLinks(BufferedReader BuffRead)引发IOException{
最终ArrayList=新ArrayList();
ParserDelegator ParserDelegator=新的ParserDelegator();
ParserCallback ParserCallback=新的ParserCallback(){
public void handleText(final char[]数据,final int pos){}
public void handleStartTag(标记标记、可变属性集属性、int-pos){
if(tag==tag.A){
字符串地址=(字符串)attribute.getAttribute(attribute.HREF);
//这是我获取HREF“链接”的地方
列表。添加(地址);
}
}
public void handleEndTag(Tag t,final int pos){}
public void handleSimpleTag(标记t,可变属性集a,final int pos){}
public void handleComment(final char[]data,final int pos){}
public void handleError(final java.lang.String errMsg,final int pos){}
};
parse(BuffRead,parserCallback,false);
退货清单;
}

< /代码> 第一:考虑不要在CapsLoop[<代码> >解析器< /代码>或<代码> MyParser < /代码>中写入您的类名,起始资本充足;

如果你只在一个网站上爬行,可能会找到很多相对链接。通常在内部使用它们,对于相对链接,你得到的结果是正确的。你知道你正在解析的网站上有外部链接吗

我不知道在什么环境下调用解析器,但如果只调用
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);
}