从网页代码中提取信息

hellox 2009-06-01 11:55:02
想要从网页的html源代码中提取想要的信息,例如从下面的代码中(在2楼)抽取出如下的信息:

车次 出发站 发车时间 抵达站 抵达时间

T100A(广州东至上海) 广州东(Guangzhou East) 18:10 上海(Shanghai) 次日11:10
T100B(九龙至上海) 广州东(Guangzhou East) 18:10 上海(Shanghai) 次日11:10
K512(三亚至上海南) 广州(Guangzhou) 9:00 上海南(Shanghai South) 次日5:43
K528(广州至南京西) 广州(Guangzhou) 8:00 上海(Shanghai) 次日4:26



...全文
326 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
netwar 2009-06-02
  • 打赏
  • 举报
回复
一个一个写得比较麻烦,

我上面写的,,测试过了,用正则表达式,你自己改下。
zhouzongjiu 2009-06-02
  • 打赏
  • 举报
回复
需要htmlparser包。

package html;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

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.nodes.TextNode;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.util.ParserException;

public class TestParser {

public void readHTML(String u) throws IOException, ParserException {
URL url = new URL(u);

URLConnection conn = url.openConnection();
conn.setConnectTimeout(1000);
conn.setReadTimeout(2000);
conn.setDoOutput(true);

String encoding = "gb2312";

InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));

StringBuffer sb = new StringBuffer();

while (br.ready()) {
sb.append(br.readLine());
sb.append("\n");
}

String content = sb.toString();

parserTable(content);
}

public void parserTable(String content) throws ParserException {
Parser parser = Parser.createParser(content, "GB2312");

NodeFilter trFilter = new NodeClassFilter(TableRow.class);

OrFilter orFilter = new OrFilter();

orFilter.setPredicates(new NodeFilter[]{trFilter});

Node[] nodes = parser.parse(orFilter).toNodeArray();

for (int i = 3; i < nodes.length; i++) {
TableColumn[] tds = ((TableRow)nodes[i]).getColumns();

for (int j = 0; j < tds.length; j++) {
getText(tds[j].getChildrenAsNodeArray());
}
System.out.println();
}
}


public void parserTable() throws ParserException {
Parser parser = new Parser();
parser.setEncoding("GB2312");
parser.setURL("D:\\aaa.htm");

NodeFilter trFilter = new NodeClassFilter(TableRow.class);

OrFilter orFilter = new OrFilter();

orFilter.setPredicates(new NodeFilter[]{trFilter});

Node[] nodes = parser.parse(orFilter).toNodeArray();

for (int i = 3; i < nodes.length; i++) {
TableColumn[] tds = ((TableRow)nodes[i]).getColumns();

for (int j = 0; j < tds.length; j++) {
getText(tds[j].getChildrenAsNodeArray());
}
System.out.println();
}
}

public void getText(Node[] n) {
for (int k = 0; k < n.length; k++) {
if (n[k] instanceof TextNode) {
if (!"".equals(n[k].getText().trim())) {

String info = n[k].getText().trim();

while (info.getBytes().length < 30) {
info += " ";
}

System.out.print(info);
}
} else {
if (n[k].getChildren() != null) {
getText(n[k].getChildren().toNodeArray());
}
}
}
}

public static void main(String[] args) {

TestParser t = new TestParser();

//解析本地页面
try {
t.parserTable();
} catch (ParserException e) {
e.printStackTrace();
}

//解析网上页面
// try {
// t.readHTML("http://xxx.xxx.xxx");
// } catch (IOException e) {
// e.printStackTrace();
// } catch (ParserException e) {
// e.printStackTrace();
// }
}

}
zhuangli_2008 2009-06-02
  • 打赏
  • 举报
回复
这是web信息抽取的知识,可以通过模板将格式一样的网页信息抽取出来
hellox 2009-06-01
  • 打赏
  • 举报
回复
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb_2312-80">
<title>火车时刻查询</title>
<meta name="Keywords" content="列车时刻,火车时刻">
<style>
<!--.nu {text-decoration: none; color: #0000FF }
A:link {text-decoration: none; color: #0000FF }
A:visited {text-decoration: none; color: #0000FF}
A:hover {text-decoration: none; color: #FF0000} -->
</style>
</head>

<body topmargin="0">

<table border="0" width="95%" bgcolor="#5162F9" cellspacing="0" align="center">
<tr>
<td width="50%"><a href="http://www.china-traveller.com"><img src="/images/ct.gif" width="400" height="61" border="0"></a></td>
<td width="50%">
<table width="100%" border="0" cellspacing="0" cellpadding="5" align="center">
<tr>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/huabei.asp"><b><font size="2" color="#FFFFFF">华北线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/huadong.asp"><b><font size="2" color="#FFFFFF">华东线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/dongbei.asp"><b><font size="2" color="#FFFFFF">东北线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/xibei.asp"><b><font size="2" color="#FFFFFF">西北线路</font></b></a></div>
</td>
</tr>
<tr>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/huazhong.asp"><b><font size="2" color="#FFFFFF">华中线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/huanan.asp"><b><font size="2" color="#FFFFFF">华南线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/xinan.asp"><b><font size="2" color="#FFFFFF">西南线路</font></b></a></div>
</td>
<td>
<div align="center"><a href="http://www.china-traveller.com/area/chujing.asp"><b><font size="2" color="#FFFFFF">出境线路</font></b></a></div>
</td>
</tr>
</table>
</td>
</tr>
</table>

<br>

<div align="center">




<p align="center"><font size="2" color="#008080"><b class="tm">广州至上海(仅供参考,如有变动,请注意车站公告)</b></font></p>
<div align="center">
<table border="1" width="90%" bordercolor="#FFFFFF" cellspacing="1"
bordercolorlight="#000000">
<tr>
<td bgcolor="#008080" width="212">
<p align="center"><font size="2" color="#FFFFFF"><b>车次</b></font>
</td>
<td bgcolor="#008080" width="202"><font size="2">
<p align="center"><b><font
color="#FFFFFF">出发站</font></b>
</font></td>
<td bgcolor="#008080" width="90"><font size="2">
<p align="center"><b><font
color="#FFFFFF">发车时间</font></b>
</font></td>
<td bgcolor="#008080" width="183"><font size="2">
<p align="center"><b><font
color="#FFFFFF">抵达站</font></b>
</font></td>
<td bgcolor="#008080" width="103"><font size="2">
<p align="center"><b><font
color="#FFFFFF">抵达时间</font></b>
</font></td>
</tr>

<tr bgcolor="#F2F9F9" onMouseOut="this.style.background='#F2F9F9'" onMouseOver="this.style.background='#CAE4FF'">
<td width="212">
<p align="center"><a href="train_detail.asp?checi=T100A" target="_blank"><font size="2" color="#FF0000">T100A(广州东至上海)</font>
</a><br>
</td>
<td width="202">
<p align="center"><font size="2">广州东(Guangzhou East)<br>
</font>
</td>
<td width="90">
<p align="center"><font size="2">18:10<br>
</font>
</td>
<td width="183">
<p align="center"><font size="2">上海(Shanghai)<br>
</font>
</td>
<td width="103">
<p align="center"><font size="2">次日11:10<br>
</font>
</td>
</tr>

<tr bgcolor="#F2F9F9" onMouseOut="this.style.background='#F2F9F9'" onMouseOver="this.style.background='#CAE4FF'">
<td width="212">
<p align="center"><a href="train_detail.asp?checi=T100B" target="_blank"><font size="2" >T100B(九龙至上海)</font>
</a><br>
</td>
<td width="202">
<p align="center"><font size="2">广州东(Guangzhou East)<br>
</font>
</td>
<td width="90">
<p align="center"><font size="2">18:10<br>
</font>
</td>
<td width="183">
<p align="center"><font size="2">上海(Shanghai)<br>
</font>
</td>
<td width="103">
<p align="center"><font size="2">次日11:10<br>
</font>
</td>
</tr>

<tr bgcolor="#F2F9F9" onMouseOut="this.style.background='#F2F9F9'" onMouseOver="this.style.background='#CAE4FF'">
<td width="212">
<p align="center"><a href="train_detail.asp?checi=K512" target="_blank"><font size="2" >K512(三亚至上海南)</font>
</a><br>
</td>
<td width="202">
<p align="center"><font size="2">广州(Guangzhou)<br>
</font>
</td>
<td width="90">
<p align="center"><font size="2">9:00<br>
</font>
</td>
<td width="183">
<p align="center"><font size="2">上海南(Shanghai South)<br>
</font>
</td>
<td width="103">
<p align="center"><font size="2">次日5:43<br>
</font>
</td>
</tr>

<tr bgcolor="#F2F9F9" onMouseOut="this.style.background='#F2F9F9'" onMouseOver="this.style.background='#CAE4FF'">
<td width="212">
<p align="center"><a href="train_detail.asp?checi=K528" target="_blank"><font size="2" >K528(广州至南京西)</font>
</a><br>
</td>
<td width="202">
<p align="center"><font size="2">广州(Guangzhou)<br>
</font>
</td>
<td width="90">
<p align="center"><font size="2">8:00<br>
</font>
</td>
<td width="183">
<p align="center"><font size="2">上海(Shanghai)<br>
</font>
</td>
<td width="103">
<p align="center"><font size="2">次日4:26<br>
</font>
</td>
</tr>

</table>
</div>

<form method="GET" action="train.asp" target="_blank">
<input type="hidden" name="from" value="上海"><input type="hidden" name="to"
value="广州"><div align="center"><p><input TYPE="submit"
VALUE="返程车次查询"></p>
</div>
</form>


<div align="center">
<script type="text/javascript"><!--
google_ad_client = "pub-3494826308550115";
//728x90, 创建于 07-11-6
google_ad_slot = "6968038796";
google_ad_width = 728;
google_ad_height = 90;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
</body>
</html>




hellox 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bingliang008 的回复:]
引用 7 楼 Johnson_Hong 的回复:
用httpclient发送请求,得到返回html;用htmlparser解析

我比较认同这种方式~~~~~~~
[/Quote]

现在是已经得到了html,举个例子,是得到了从2个不同网站返回的html,其中1个的部分源码是
<table onclick=sortColumn(event) border=0 bgcolor=#0033cc cellspacing=1 cellpadding=0 width=770 align=center><THEAD><tr bgcolor=#ffffff><td align=center height=18><a href=# title=按车次排序>车次</a></td><td align=center height=18><a href=#>类型</a></td><td align=center height=18><a href=#>始发站</a></td><td align=center height=18><a href=#>出发站</a></td><td align=center height=18><a href=#>开车时间</a></td><td align=center height=18><a href=#>目的站</a></td><td align=center height=18><a href=#>到达时间</a></td><td align=center height=18><a href=#>用时</a></td><td align=center height=18><a href=#>里程</a></td><td align=center height=18><a href=#>终点站</a></td><td align=center height=18><a href=#>硬座</a></td><td align=center height=18><a href=#>软座</a></td><td align=center height=18><a href=#>硬卧中</a></td><td align=center height=18><a href=#>软卧下</a></td></tr></THEAD><tr bgcolor=#ffffff onmouseover=this.bgColor='#eeeeee'; onmouseout=this.bgColor='#ffffff';><td align=center height=18><a href=http://www.huoche.com.cn/c106912/>K528</a></td><td align=center height=18>空调快速</td><td align=center height=18><a href=http://www.huoche.com.cn/z891/>广州</a></td><td align=center height=18><a href=http://www.huoche.com.cn/z891/>广州</a></td><td align=center height=18>08:08</td><td align=center height=18><a href=http://www.huoche.com.cn/z2132830382/>上海南</a></td><td align=center height=18>次日04:10</td><td align=center height=18>20小时2分</td><td align=center height=18>1780</td><td align=center height=18><a href=http://www.huoche.com.cn/z1909/>南京西</a></td><td align=center height=18>203</td><td align=center height=18>-</td><td align=center 


另一个得到页面部分的html:
  <td width="60" align="center"><a href="javascript:this.print()" class="blacktext">打印此页</a></td>
</tr>
</table></td>
</tr>
<tr>
<td align="center"><table width="100%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#CDD9EF" frame="hsides" style="border-collapse:collapse;">
<tr align="center" valign="middle" bgcolor="#E8F1FF" class="litbluetext">
<td width="85" height="35">车次</td>
<td width="75" colspan="2">起始车站</td>
<td width="75">到达车站</td>
<td width="65" style="cursor:hand; cursor:pointer ; text-decoration:underline"><a style=" text-decoration:underline; color:#0D35B1" href="zhanzhan.asp?HomeCity=广州&zhanming=上海&sort=a&">发车时间<img src='http://pages.ctrip.com/images/train/sort_down_x.gif'>
</a></td>
<td width="65" style="cursor:hand; cursor:pointer; text-decoration:underline "><a style=" text-decoration:underline; color:#0D35B1" href="zhanzhan.asp?HomeCity=广州&zhanming=上海&sort=b&">到站时间<img src='http://pages.ctrip.com/images/train/sort_down_x.gif'>
</a></td>
<td width="75" style="cursor:hand; cursor:pointer ; text-decoration:underline"><a style=" text-decoration:underline; color:#0D35B1" href="zhanzhan.asp?HomeCity=广州&zhanming=上海&sort=c&">走行时间<img src='http://pages.ctrip.com/images/train/sort_down_x.gif'>
</a></td>
<td width="50">硬座</td>
<td width="50">硬卧</td>
<td width="50">软卧</td>
<td width="65">软座</td>
<td>始发站-终到站</td>
</tr>

<tr onmouseover="this.style.backgroundColor='#FDFFD8'" onmouseout="this.style.backgroundColor=''" align="center" valign="middle">
<td height="25"><a href="checi.asp?checi=K528" class="redtext01zz">K528</a></td>

<td style="border-right:0px"><img src="http://pic.ctrip.com/desinations/pic_start.gif"></td>


现在想要:
从第一个中提取出:
“车次 类型 始发站 出发站 开车时间 目的站 到达时间 用时 里程 终点站 硬座 软座 硬卧中 软卧下
K528 空调快速 广州 广州 08:08 上海南 次日04:10 20小时2分 1780 南京西 203 - 357 568
……
……”
这样的信息

从第二个中提取出:
车次 起始车站 到达车站 发车时间 到站时间 走行时间 硬座 硬卧 软卧 软座 始发站-终到站
K512 广州 上海南 09:01 05:38 20小时37分钟 152 271 424 - 三亚--上海南
……
……

这样的信息

其实有N个这样的页面,是从不同的网站查询返回的,不知道能不能统一处理?
现在的输入就是N个这样的页面的html,想要的输出就是像上面所说的那样。
先谢谢大家……
bingliang008 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Johnson_Hong 的回复:]
用httpclient发送请求,得到返回html;用htmlparser解析
[/Quote]
我比较认同这种方式~~~~~~~
Yedy2000 2009-06-01
  • 打赏
  • 举报
回复
mark
netwar 2009-06-01
  • 打赏
  • 举报
回复
<tr.+?>[.\s\S]*?<font.*?>(.*?)</font>[.\s\S]*?<font.*?>(.*?)<br>\s*</font>[.\s\S]*?<font.*?>(.*?)<br>\s*</font>[.\s\S]*?<font.*?>(.*?)<br>\s*</font>

正则表达式就可以了。
tjyyyatjp 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 janely318 的回复:]
一只菜鸟飘过,你要是可怜我就给我一分
[/Quote]
.....
wibnmo 2009-06-01
  • 打赏
  • 举报
回复
帮顶先。
w40338544 2009-06-01
  • 打赏
  • 举报
回复
URL 可以获得html源码,然后再过滤一下.获取你想要的内容
richard_2010 2009-06-01
  • 打赏
  • 举报
回复
用jQuery很好解决
afeilxc 2009-06-01
  • 打赏
  • 举报
回复
根据 <tr bgcolor="#F2F9F9" onMouseOut="this.style.background='#F2F9F9'" onMouseOver="this.style.background='#CAE4FF'"> ,从中提取标志利用正则表达式过滤做循环一次提取就可以了
Johnson_Hong 2009-06-01
  • 打赏
  • 举报
回复
用httpclient发送请求,得到返回html;用htmlparser解析
eiro 2009-06-01
  • 打赏
  • 举报
回复
用httpclient获取页面里的信息
zousifang661236 2009-06-01
  • 打赏
  • 举报
回复
我建议不用表格,用CSS样式表,把上面的再改一下
君_洛洛 2009-06-01
  • 打赏
  • 举报
回复
一只菜鸟飘过,你要是可怜我就给我一分
NickCheng 2009-06-01
  • 打赏
  • 举报
回复
是这样吗?提前所有html元素!

public static String splitAndFilterString(String input, int length) {
if (input == null || input.trim().equals("")) {
return "";
}
// 去掉所有html元素,
String str = input.replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll(
"<[^>]*>", "");
str = str.replaceAll("[(/>)<]", "");
int len = str.length();
if (len <= length) {
return str;
} else {
str = str.substring(0, length);
str += "......";
}
return str;
}

goodmrning 2009-06-01
  • 打赏
  • 举报
回复
帮顶下先!

62,616

社区成员

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

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