注冊
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
正则表达式论坛
»
答疑解惑
» 【求助】提取html源码中指定位置的信息
1
2
下一页
返回列表
发帖
coolfeng
发短消息
加为好友
coolfeng
当前离线
UID
2236
帖子
12
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2010-8-19
最后登录
2010-11-22
新手上路
1
#
跳转到
»
倒序看帖
打印
字体大小:
t
T
发表于 2010-8-26 15:39
|
只看该作者
【求助】提取html源码中指定位置的信息
<dl onmouseover="this.className='Footer'" onmouseout="this.className='Middle'">
<dd class="Left TC" style="width:50px"><img src="template/default/skins/default/topic_hot.gif" align="absmiddle" /></dd>
<dd class="Right" style="width:220px">
<div class="Left" style="width:120px;">2009-11-27 12:16:09</div>
<div class="Left"><span class="Red">|</span> <a href="ControlPanel.aspx?UserID=482" target="_blank">数科院朱海燕</a></div>
</dd>
<dd class="Right TL" style="width:50px">1031</dd>
<dd class="Right TR" style="width:50px"><font color="#ff0099"><b>29</b></font> | </dd>
<dd class="Right TR" style="width:100px"><a href="ControlPanel.aspx?UserID=5" target="_blank">shelling-辅导教师</a></dd>
<dd style="margin-left:50px"> <a href="Topic.aspx?BoardID=11&TopicID=22"><font color="#000000">关于“看”的中文词义差异比较(课后讨论题)</font></a> <b>[</b> <img src="template/default/skins/default/follow.gif" align=absmiddle /> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=1" target="_self">1</a> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=2" target="_self">2</a> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=3" target="_self">3</a> <b>]</b> <img src=template/default/skins/default/topic_color.gif border=0 align=absmiddle /> <img src=template/default/skins/default/hot.gif border=0 align=absmiddle /></dd>
</dl>
复制代码
需求有两个:
(1)html原文件中有许多<dl>````</dl>的节点,需求出所有出现的节点书目
(2)提取<dl>``</dl>中特定位置的文字信息,如"关于“看”的中文词义差异比较(课后讨论题)"
正则写了好多个,总是匹配不成功~~~
收藏
分享
rex
发短消息
加为好友
rex
当前离线
UID
2
帖子
464
精华
0
积分
254
阅读权限
200
在线时间
224 小时
注册时间
2008-11-3
最后登录
2012-2-3
管理员
2
#
发表于 2010-8-26 20:01
|
只看该作者
节点书目=>节点数目?
标准的正则走两个极端,要么匹配之后立即退出,要么匹配得越多越好。因此,用它来计算匹配了多少次,不能单纯依赖正则,而是要辅助上编程语言。你使用什么语言?java?
不理解第2个问题,请详解。谢谢。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter:
rex_zhasm
TOP
coolfeng
发短消息
加为好友
coolfeng
当前离线
UID
2236
帖子
12
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2010-8-19
最后登录
2010-11-22
新手上路
3
#
发表于 2010-8-27 13:17
|
只看该作者
html源码的简略结构是这样的:
<html>
<head>```</head>
<body>
<dl>
(中间内容同第一帖)
</dl>
<dl>
`````
</dl>
`````
</body></html>
复制代码
编程语言使用java,第一个问题是要求出该html源文件中匹配了多少次<dl>```</dl>
这种结构,是可以通过编程实现的,已经解决;
第二个问题其实还是使用正则表达式,抽取
<dl> `````</dl>中的最后一个<dd>```</dd>中包含的部分字符串,如下面代码中红色的部分:
<dd style="margin-left:50px"> <a href="Topic.aspx?BoardID=11&TopicID=22"><font color="#000000">
关于“看”的中文词义差异比较(课后讨论题)
</font></a> <b>[</b> <img src="template/default/skins/default/follow.gif" align=absmiddle /> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=1" target="_self">1</a> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=2" target="_self">2</a> <a href="Topic.aspx?BoardID=11&TopicID=22&Page=3" target="_self">3</a> <b>]</b> <img src=template/default/skins/default/topic_color.gif border=0 align=absmiddle /> <img src=template/default/skins/default/hot.gif border=0 align=absmiddle /></dd>
不知道把问题所清楚了没,谢谢解答···
TOP
rex
发短消息
加为好友
rex
当前离线
UID
2
帖子
464
精华
0
积分
254
阅读权限
200
在线时间
224 小时
注册时间
2008-11-3
最后登录
2012-2-3
管理员
4
#
发表于 2010-8-27 13:36
|
只看该作者
建议仍结合编程语言实现。
思路之一:
找出<dl>结构;
匹配其中的<dd>结构;
定位到最后一组;
删除所有的<[^>]+>,即为所求。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter:
rex_zhasm
TOP
coolfeng
发短消息
加为好友
coolfeng
当前离线
UID
2236
帖子
12
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2010-8-19
最后登录
2010-11-22
新手上路
5
#
发表于 2010-8-27 16:01
|
只看该作者
public static void main(String[] args) {
String url = "http://www.fromeyes.cn/bbs/Board.aspx?BoardID=11&GroupID=0";
GetSourceHtml gst = new GetSourceHtml();
HtmlEntity he = new HtmlEntity();
gst.getHtml(url, he);
//System.out.println(he.getHtml());
String contentReg = "<dl[^>]*>(<dd[^>]*>.+</dd>){5}<dd[^>]*>[\\s]*<a[^>]*><font[^>]*>([^<]+)</font></a>[\\s]+<[^>]+></dd></dl>" ;
Pattern p ;
Matcher m;
p = Pattern.compile(contentReg);
m = p.matcher(he.getHtml());//he.getHtml()为获取的网页源代码
System.out.println(m.groupCount());
int num = 0;
while(m.find()){
System.out.println("group1 :" +m.group(2));
num++;
System.out.println("NUM: " + num);
}
}
m.group(2)依然取不到想要的值。
复制代码
TOP
coolfeng
发短消息
加为好友
coolfeng
当前离线
UID
2236
帖子
12
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2010-8-19
最后登录
2010-11-22
新手上路
6
#
发表于 2010-8-27 20:15
|
只看该作者
解决了,还是正则表达式写的有问题
改为:String contentReg = "<dl[^>]*>(<dd[^>]*>(.+?)</dd>){5}<dd[^>]*><a[^>]*><font[^>]*>([^<]+)</font></a>(.*?)</dd></dl>" ;
可以正常抽取,是不是写的不够简洁,有没有更有效率的写法?
TOP
rex
发短消息
加为好友
rex
当前离线
UID
2
帖子
464
精华
0
积分
254
阅读权限
200
在线时间
224 小时
注册时间
2008-11-3
最后登录
2012-2-3
管理员
7
#
发表于 2010-8-28 19:43
|
只看该作者
好,我一会儿回来看看。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter:
rex_zhasm
TOP
rex
发短消息
加为好友
rex
当前离线
UID
2
帖子
464
精华
0
积分
254
阅读权限
200
在线时间
224 小时
注册时间
2008-11-3
最后登录
2012-2-3
管理员
8
#
发表于 2010-8-29 07:38
|
只看该作者
指定{5}, 这样的做法一般来说是比较苛刻的,除非你明确知道数据格式的确如此。我写了一段正则代码,它匹配dl结构中最后一个dd元素,然后在该元素中找<a..<font...中间的内容, 可以参考。另,如果是括号以及量词的结构,即(...)* or (...)之类,其内捕获的元素,是最后一次匹配的内容。请读这篇文章:
http://iregex.org/blog/recursive-regex-in-php.html
String ResultString = null;
try {
Pattern regex = Pattern.compile(
"<dl[^>]*>\\s*\n" +
" (?:<dd[^>]*>\n" +
" .*?<a[^>]+>\\s*\n" +
" <font[^>]+>\n" +
" ([^<>]+).*?\n" +
" </dd>\\s*)*\n" +
"</dl>",
Pattern.DOTALL | Pattern.COMMENTS);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
ResultString = regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
复制代码
见插图:
附件:
您需要
登录
才可以下载或查看附件。没有帐号?
注冊
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter:
rex_zhasm
TOP
coolfeng
发短消息
加为好友
coolfeng
当前离线
UID
2236
帖子
12
精华
0
积分
0
阅读权限
10
在线时间
3 小时
注册时间
2010-8-19
最后登录
2010-11-22
新手上路
9
#
发表于 2010-8-29 16:58
|
只看该作者
你是意思是不要考虑前面到底有几个<dd>,只匹配最后一个的模式就好吧 (?:<dd[^>]*>\n"中 “?:”怎么解释
TOP
rex
发短消息
加为好友
rex
当前离线
UID
2
帖子
464
精华
0
积分
254
阅读权限
200
在线时间
224 小时
注册时间
2008-11-3
最后登录
2012-2-3
管理员
10
#
发表于 2010-8-29 17:37
|
只看该作者
不论有多少个dd, 都会匹配的,要点在于只
捕获
最后一次的匹配。
?: 是“匹配但不捕获”,用来分组。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter:
rex_zhasm
TOP
1
2
下一页
返回列表
网海文摘
正则利器
书记答疑
搜索引擎
闲聊灌水
开发应用
正则引擎
学习资料
站务管理
广告招聘
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]