关于网页抓取链接内容的正则表达式

t2xingzhe 2010-08-26 09:34:44
小弟最近研究网页抓取,可惜这个正则困扰我很长时间。。


package com.test;

import java.io.*;
import java.net.*;

public class du_wangye_0100 {

/**
* @param args
*/
public static void main(String[] args) throws IOException{

String htmlurl = "http://www.qq163.com";

String tmp = readhtml(htmlurl,"gbk");
get_a(tmp);

String str = "<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a> ┊ <a href=\"http://www.3533.com/phone/\">手机大全</a> ┊ <a href=\"http://www.ip138.com/\">iP查询</a> ┊ <a href=\"http://game.3533.com/zhuti/\" >手机主题</a>";
String regex = "<a href=\".+[^:]\"\\S+</a>";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.find()) {
System.out.println(m.group());
}

}


static String readhtml(String htmlurl,String charset) throws IOException{
StringBuffer sb = new StringBuffer();
URL url = new URL(htmlurl);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
InputStream in = url.openStream();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(in,charset));
System.out.println("开始读取网页");
while((line = br.readLine())!= null){

sb.append(line);
}
br.close();
in.close();
return sb.toString();
}

static void get_a(String line){
String regx;
regx="<a href=\"\\S+\"";
//regx="<a href=\".+\"\\S+>\\w+</a>";
Pattern p = Pattern.compile(regx);

Matcher m = p.matcher(line);
while(m.find()){
System.out.println(m.group());
}

}

}



因为读取的网页内容会组成一个String返回,我想读取在<a href=>。。。</a>这种字符串,是在不知道该怎么写了,比如
String str = "<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>;

我自己写得是String regex = "<a href=\".+[^:]\"\\S+</a>";
还试过很多String regex = "<a href=\"\\S+\"\\S+</a>";

哪位高手出个主意把那个字符串读取出<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a>
<a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>
这样的
...全文
606 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
duke19810210 2012-03-23
  • 打赏
  • 举报
回复
Android下是否也可以使用呢?
研究下API先。
愚公移码 2011-01-06
  • 打赏
  • 举报
回复
用jsoup非常强大,特别对于使用过jquery的用户。
t2xingzhe 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huntor 的回复:]

jsoup是一款开源的HTML解析工具包,采用Java语言编写,通过精巧的API充分利用DOM、CSS和类jquery的方法抽取和操作数据。jsoup采用MIT协议开源。
http://jsoup.org/download

另外,XPath/XQuery/XQJ也可以用来做这个。
Java 理论与实践: 用 XQuery 进行屏幕搜集
[/Quote]

再次感谢,正在研究这个的源代码
t2xingzhe 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fulinkster 的回复:]

Java code

public static void main(String[] args) {
String str = "sfsf<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao12……
[/Quote]

兄弟你太高了,经测试完全有效,这个.*?是啥意思?.*是任何字符出现0次或多次?
.?是任何字符出现一次或一次也没有?不太明白,看来需要学的还有很多,感谢这位兄弟的解答
t2xingzhe 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zghbsyqyb 的回复:]

我刚研究了一下,写这个正则表达式确实非同凡响,最近也涉及到这个东西,一楼的思路很好,不过那个Jsoup不知道是什么东西,jdk里面好像没有。
这道提醒了一种思路,把html代码转dom,然后在解析,这样准确度很高啊。正则表达式匹配的容易出问题。
可以考虑用可行的办法把html转化成dom,Java应该可以。其实我有一种思路,把你得到的html用js按照你的规则解析效果会非常好。getElem……
[/Quote]

感谢回答,由于本人的js不是很好~所以开始就没往js那里想,等学好js再试试,感谢给我开了个新的思路
fulinkster 2010-08-27
  • 打赏
  • 举报
回复

public static void main(String[] args) {
String str = "sfsf<a href=\"http://www.3533.com/\" target=\"_blank\">手机世界</a> ┊ <a href=\"http://www.hao123.com/\" target=\"_blank\">hao123网址之家</a>sfdsf";
Pattern p = Pattern.compile("<a href=.*?>.*?</a>");
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group());
}
}
  • 打赏
  • 举报
回复
我刚研究了一下,写这个正则表达式确实非同凡响,最近也涉及到这个东西,一楼的思路很好,不过那个Jsoup不知道是什么东西,jdk里面好像没有。
这道提醒了一种思路,把html代码转dom,然后在解析,这样准确度很高啊。正则表达式匹配的容易出问题。
可以考虑用可行的办法把html转化成dom,Java应该可以。其实我有一种思路,把你得到的html用js按照你的规则解析效果会非常好。getElementByTag("...")这类东西..,然后在组织起来。
t2xingzhe 2010-08-27
  • 打赏
  • 举报
回复
楼上的解答我还没有证实,先感谢下,然后我再研究下那个怎么用
ditouye 2010-08-27
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
huntor 2010-08-27
  • 打赏
  • 举报
回复
jsoup是一款开源的HTML解析工具包,采用Java语言编写,通过精巧的API充分利用DOM、CSS和类jquery的方法抽取和操作数据。jsoup采用MIT协议开源。
http://jsoup.org/download

另外,XPath/XQuery/XQJ也可以用来做这个。
Java 理论与实践: 用 XQuery 进行屏幕搜集
huntor 2010-08-26
  • 打赏
  • 举报
回复
	URL url = new URL("http://www.qq163.com");
Document doc = Jsoup.parse(url,30000);

Elements links = doc.select("a");
for(Element link:links){
// System.out.println(link);
System.out.println(link.attr("href"));
System.out.println(link.attr("target"));
System.out.println(link.text());
}

使用jsoup 1.3.1

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧