如何使用 javax.swing.text.html 从 HREF 标签中获取 Full/Absolute link?
How to get Full/Absolute link from HREF tag using javax.swing.text.html?
我试图在网站中获取 links,并将它们放在 List
上,但我经常得到不完整的没有根站点的 links。例如,我得到类似 /thing.html/
而不是 http://website.com/thing.html/
它是一个搜索引擎,所以我也需要解析网站的 link,为此我需要完整的 link。
我也不允许使用任何第三方库,例如 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;
}
首先:考虑不要将您的 class 名字写成大写锁定 Parser
或 MyParser
并且起始资本就足够了 ;)
如果您只抓取一个网站,则可能有相当多的相关 link 可供查找。在内部和相对 links 中使用它们是很常见的,你得到的结果是正确的。您知道您正在解析的网站上有外部 link 吗?
我不知道你在什么环境下调用你的解析器,但如果你只是在不知道你正在解析的网站的情况下调用 Parser.getLinks(someBuffer)
,你只剩下你找到的 links .如果您正在解析在线站点,可以只添加基础 url。既然你知道你现在在哪个网站,你可以传递 url 并将其添加到你的亲戚 link:
方法接口应该是这样的
public static List<String> getLinks(BufferedReader BuffRead, String baseUrl) throws IOException
你会用类似的东西检查相对 links(这很简单)
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);
}
问候
我试图在网站中获取 links,并将它们放在 List
上,但我经常得到不完整的没有根站点的 links。例如,我得到类似 /thing.html/
而不是 http://website.com/thing.html/
它是一个搜索引擎,所以我也需要解析网站的 link,为此我需要完整的 link。
我也不允许使用任何第三方库,例如 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;
}
首先:考虑不要将您的 class 名字写成大写锁定 Parser
或 MyParser
并且起始资本就足够了 ;)
如果您只抓取一个网站,则可能有相当多的相关 link 可供查找。在内部和相对 links 中使用它们是很常见的,你得到的结果是正确的。您知道您正在解析的网站上有外部 link 吗?
我不知道你在什么环境下调用你的解析器,但如果你只是在不知道你正在解析的网站的情况下调用 Parser.getLinks(someBuffer)
,你只剩下你找到的 links .如果您正在解析在线站点,可以只添加基础 url。既然你知道你现在在哪个网站,你可以传递 url 并将其添加到你的亲戚 link:
方法接口应该是这样的
public static List<String> getLinks(BufferedReader BuffRead, String baseUrl) throws IOException
你会用类似的东西检查相对 links(这很简单)
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);
}
问候