【问题标题】:How to get Full/Absolute link from HREF tag using javax.swing.text.html?如何使用 javax.swing.text.html 从 HREF 标记获取完整/绝对链接?
【发布时间】:2015-05-30 04:29:46
【问题描述】:

我正在尝试获取网站中的链接,并将它们放在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;
}

【问题讨论】:

    标签: java html swing parsing href


    【解决方案1】:

    首先:考虑不要用大写锁定 ParserMyParser 写你的类名,起始大写就足够了;)

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

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

    问候

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2021-12-25
      • 2019-04-14
      • 2019-12-23
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多