import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}
// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
try {
Parser parser = new Parser(url);
parser.setEncoding("utf-8");
// 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().contains("category")
|| node.getText().contains("mcategory")
//|| node.getText().startsWith("frame src=")
// || node.getText().startsWith("img src=")
) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,<img> 标签和 <frame> 标签,三个标签是 or 的关系
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
String text = link.getLinkText();// 链接文字
System.out.println(linkUrl + "********" + text);
} else if (tag instanceof ImageTag)// <img> 标签
{
ImageTag image = (ImageTag) list.elementAt(i);
System.out.print(image.getImageURL() + "********");// 图片地址
System.out.println(image.getText());// 图片文字
} else// <frame> 标签
{
// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
frame = frame.substring(5, end - 1);
System.out.println(frame);
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
}
有运行结果就是最后报空指针异常
[code="java"]
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}
// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
try {
Parser parser = new Parser(url);
parser.setEncoding("utf-8");
// 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().contains("category")
|| node.getText().contains("mcategory")
//|| node.getText().startsWith("frame src=")
// || node.getText().startsWith("img src=")
) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,<img> 标签和 <frame> 标签,三个标签是 or 的关系
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
String text = link.getLinkText();// 链接文字
System.out.println(linkUrl + "********" + text);
} else if (tag instanceof ImageTag)// <img> 标签
{
ImageTag image = (ImageTag) list.elementAt(i);
System.out.print(image.getImageURL() + "********");// 图片地址
System.out.println(image.getText());// 图片文字
} else// <frame> 标签
{
// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
if (start >= 0) {
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
frame = frame.substring(5, end - 1);
System.out.println(frame);
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
}
[/code]
能把你用到的Jar包通过附件传一下么
[quote]有运行结果就是最后报空指针异常[/quote]
空指针是最容易改的bug了,只要查一下第几行代码就知道哪儿空了,自己多检查下就知道了。
还有代码不能用code标签包一下么……这样看着多累啊……
[quote]可以加你qq吗[/quote]
我现在上班时间上不了QQ啊。。。。。
你还是把htmlparser的Jar包传一下把,Jar包,不要打成ZIP包
我怎么没报异常???
你哪行报啊?
[quote]else// 标签
{ [/quote]
这个。。其它情况都是frame标签么?如果页面上还有其它东西怎么办?
那你就再判断下是不是FrameTag咯
[code="java"]import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.FrameTag;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}
// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
try {
Parser parser = new Parser(url);
parser.setEncoding("utf-8");
// 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().contains("category")
|| node.getText().contains("mcategory")
//|| node.getText().startsWith("frame src=")
// || node.getText().startsWith("img src=")
) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,<img> 标签和 <frame> 标签,三个标签是 or 的关系
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
String text = link.getLinkText();// 链接文字
System.out.println(linkUrl + "********" + text);
} else if (tag instanceof ImageTag)// <img> 标签
{
ImageTag image = (ImageTag) list.elementAt(i);
System.out.print(image.getImageURL() + "********");// 图片地址
System.out.println(image.getText());// 图片文字
// ******* 2011-05-16 redstarofsleep modify start *******
} else if (tag instanceof FrameTag) {// 标签
// 提取 frame 里 src 属性的链接如
String frame = tag.getText();
int start = frame.indexOf("src=");
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
frame = frame.substring(5, end - 1);
System.out.println(frame);
}
// else// 标签
// {
// // 提取 frame 里 src 属性的链接如
// String frame = tag.getText();
// int start = frame.indexOf("src=");
// frame = frame.substring(start);
// int end = frame.indexOf(" ");
// if (end == -1)
// end = frame.indexOf(">");
// frame = frame.substring(5, end - 1);
// System.out.println(frame);
// }
// ******* 2011-05-16 redstarofsleep modify end *******
}
} catch (ParserException e) {
e.printStackTrace();
}
}
}
[/code]
这个就可以
你注释里写的就是// 标签
// 提取 frame 里 src 属性的链接如
我拿的就是frame啊。。。
不明白你到底是要拿什么。。。。。。。。
改成这样么?
[code="java"]
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}
// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
try {
Parser parser = new Parser(url);
parser.setEncoding("utf-8");
// 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().contains("category")
|| node.getText().contains("mcategory")
//|| node.getText().startsWith("frame src=")
// || node.getText().startsWith("img src=")
) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,<img> 标签和 <frame> 标签,三个标签是 or 的关系
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
String text = link.getLinkText();// 链接文字
System.out.println(linkUrl + "********" + text);
} else if (tag instanceof ImageTag)// <img> 标签
{
ImageTag image = (ImageTag) list.elementAt(i);
System.out.print(image.getImageURL() + "********");// 图片地址
System.out.println(image.getText());// 图片文字
} else// <frame> 标签
{
// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
String frame = tag.getText();
int start = frame.indexOf("src=");
if (start >= 0) {
frame = frame.substring(start);
int end = frame.indexOf(" ");
if (end == -1)
end = frame.indexOf(">");
frame = frame.substring(5, end - 1);
System.out.println(frame);
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
}
[/code]
我就是不知道你要获取什么东西?你要获取的页面是什么样子的。。。。。。
那就是拿li里面的a咯
你拿frame干吗?
[code="java"]
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Catenate {
public static void main(String[] args) throws Exception {
String url = "http://www.bradfordexchange.com/";
extracLinks(url);
}
// 获取一个网页上所有的链接和图片链接
@SuppressWarnings("serial")
public static void extracLinks(String url) {
try {
Parser parser = new Parser(url);
parser.setEncoding("utf-8");
// 过滤 <frame> 标签的 filter,用来提取 frame 标签里的 src 属性所、表示的链接
NodeFilter frameFilter = new NodeFilter() {
public boolean accept(Node node) {
if (node.getText().contains("category")
|| node.getText().contains("mcategory")
//|| node.getText().startsWith("frame src=")
// || node.getText().startsWith("img src=")
) {
return true;
} else {
return false;
}
}
};
// OrFilter 来设置过滤 <a> 标签,<img> 标签和 <frame> 标签,三个标签是 or 的关系
OrFilter linkFilter = new OrFilter(new NodeClassFilter(
LinkTag.class), frameFilter);
// 得到所有经过过滤的标签
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (int i = 0; i < list.size(); i++) {
Node tag = list.elementAt(i);
if (tag instanceof LinkTag)// <a> 标签
{
LinkTag link = (LinkTag) tag;
String linkUrl = link.getLink();// url
String text = link.getLinkText();// 链接文字
System.out.println(linkUrl + "********" + text);
} else if (tag instanceof ImageTag)// <img> 标签
{
ImageTag image = (ImageTag) list.elementAt(i);
System.out.print(image.getImageURL() + "********");// 图片地址
System.out.println(image.getText());// 图片文字
} else// <frame> 标签
{
// // 提取 frame 里 src 属性的链接如
// String frame = tag.getText();
// int start = frame.indexOf("src=");
// if (start >= 0) {
// frame = frame.substring(start);
// int end = frame.indexOf(" ");
// if (end == -1)
// end = frame.indexOf(">");
// frame = frame.substring(5, end - 1);
// System.out.println(frame);
// }
String li = tag.getText();
if (li.startsWith("li")) {
LinkTag a = (LinkTag)tag.getFirstChild();
String linkUrl = a.getLink();
String text = a.getLinkText();
System.out.println(linkUrl + "********" + text);
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
}
[/code]
可能是我公司里有代理,所以我没办法跑这个代码。
你看看这样子改是不是你要的结果?
我觉得可能会出现2种结果:
第一种就是正确了,那最好。
第二种就是比你想要的多,那是因为你那段有问题的代码抛出异常后停止了,现在那个地方改了,就会把整个循环走完,所以有可能会多一些结果