返回列表 发帖

【求助】提取html源码中指定位置的信息

  1. <dl onmouseover="this.className='Footer'" onmouseout="this.className='Middle'">
  2.         <dd class="Left TC" style="width:50px"><img src="template/default/skins/default/topic_hot.gif" align="absmiddle" /></dd>
  3.         <dd class="Right" style="width:220px">
  4.                 <div class="Left" style="width:120px;">2009-11-27 12:16:09</div>
  5.                 <div class="Left"><span class="Red">|</span> <a href="ControlPanel.aspx?UserID=482" target="_blank">数科院朱海燕</a></div>
  6.         </dd>
  7.         <dd class="Right TL" style="width:50px">1031</dd>
  8.         <dd class="Right TR" style="width:50px"><font color="#ff0099"><b>29</b></font>&nbsp;|&nbsp;</dd>
  9.         <dd class="Right TR" style="width:100px"><a href="ControlPanel.aspx?UserID=5" target="_blank">shelling-辅导教师</a></dd>
  10.         <dd style="margin-left:50px"> <a href="Topic.aspx?BoardID=11&TopicID=22"><font color="#000000">关于“看”的中文词义差异比较(课后讨论题)</font></a>&nbsp;<b>[</b> <img src="template/default/skins/default/follow.gif" align=absmiddle />&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=1" target="_self">1</a>&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=2" target="_self">2</a>&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=3" target="_self">3</a> <b>]</b>&nbsp;<img src=template/default/skins/default/topic_color.gif border=0 align=absmiddle />&nbsp;<img src=template/default/skins/default/hot.gif border=0 align=absmiddle /></dd>
  11.     </dl>
复制代码
需求有两个:
(1)html原文件中有许多<dl>````</dl>的节点,需求出所有出现的节点书目
(2)提取<dl>``</dl>中特定位置的文字信息,如"关于“看”的中文词义差异比较(课后讨论题)"

正则写了好多个,总是匹配不成功~~~

节点书目=>节点数目?
标准的正则走两个极端,要么匹配之后立即退出,要么匹配得越多越好。因此,用它来计算匹配了多少次,不能单纯依赖正则,而是要辅助上编程语言。你使用什么语言?java?

不理解第2个问题,请详解。谢谢。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter: rex_zhasm

TOP

html源码的简略结构是这样的:
  1. <html>
  2. <head>```</head>
  3. <body>
  4. <dl>
  5.       (中间内容同第一帖)
  6. </dl>
  7. <dl>
  8.      `````
  9. </dl>
  10. `````
  11. </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>&nbsp;<b>[</b> <img src="template/default/skins/default/follow.gif" align=absmiddle />&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=1" target="_self">1</a>&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=2" target="_self">2</a>&nbsp;<a href="Topic.aspx?BoardID=11&TopicID=22&Page=3" target="_self">3</a> <b>]</b>&nbsp;<img src=template/default/skins/default/topic_color.gif border=0 align=absmiddle />&nbsp;<img src=template/default/skins/default/hot.gif border=0 align=absmiddle /></dd>

不知道把问题所清楚了没,谢谢解答···

TOP

建议仍结合编程语言实现。
思路之一:
找出<dl>结构;
匹配其中的<dd>结构;
定位到最后一组;
删除所有的<[^>]+>,即为所求。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter: rex_zhasm

TOP

  1. public static void main(String[] args) {
  2.                 String url = "http://www.fromeyes.cn/bbs/Board.aspx?BoardID=11&GroupID=0";
  3.                 GetSourceHtml gst = new GetSourceHtml();
  4.                 HtmlEntity he = new HtmlEntity();
  5.                 gst.getHtml(url, he);
  6.                 //System.out.println(he.getHtml());
  7.                 String contentReg = "<dl[^>]*>(<dd[^>]*>.+</dd>){5}<dd[^>]*>[\\s]*<a[^>]*><font[^>]*>([^<]+)</font></a>[\\s]+<[^>]+></dd></dl>" ;
  8.                 Pattern p ;
  9.                 Matcher m;
  10.                 p = Pattern.compile(contentReg);
  11.                 m = p.matcher(he.getHtml());//he.getHtml()为获取的网页源代码
  12.                
  13.                 System.out.println(m.groupCount());
  14.                 int num = 0;
  15.                 while(m.find()){                       
  16.                         System.out.println("group1 :" +m.group(2));
  17.                         num++;       
  18.                         System.out.println("NUM: " + num);
  19.                 }

  20.                

  21.         }
  22. m.group(2)依然取不到想要的值。
复制代码

TOP

解决了,还是正则表达式写的有问题
改为:String contentReg = "<dl[^>]*>(<dd[^>]*>(.+?)</dd>){5}<dd[^>]*><a[^>]*><font[^>]*>([^<]+)</font></a>(.*?)</dd></dl>" ;
可以正常抽取,是不是写的不够简洁,有没有更有效率的写法?

TOP

好,我一会儿回来看看。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter: rex_zhasm

TOP

指定{5}, 这样的做法一般来说是比较苛刻的,除非你明确知道数据格式的确如此。我写了一段正则代码,它匹配dl结构中最后一个dd元素,然后在该元素中找<a..<font...中间的内容, 可以参考。另,如果是括号以及量词的结构,即(...)* or (...)之类,其内捕获的元素,是最后一次匹配的内容。请读这篇文章:http://iregex.org/blog/recursive-regex-in-php.html
  1. String ResultString = null;
  2. try {
  3.         Pattern regex = Pattern.compile(
  4.                 "<dl[^>]*>\\s*\n" +
  5.                 "    (?:<dd[^>]*>\n" +
  6.                 "    .*?<a[^>]+>\\s*\n" +
  7.                 "    <font[^>]+>\n" +
  8.                 "        ([^<>]+).*?\n" +
  9.                 "    </dd>\\s*)*\n" +
  10.                 "</dl>",
  11.                 Pattern.DOTALL | Pattern.COMMENTS);
  12.         Matcher regexMatcher = regex.matcher(subjectString);
  13.         if (regexMatcher.find()) {
  14.                 ResultString = regexMatcher.group(1);
  15.         }
  16. } catch (PatternSyntaxException ex) {
  17.         // Syntax error in the regular expression
  18. }
复制代码
见插图:
附件: 您需要登录才可以下载或查看附件。没有帐号?注冊
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter: rex_zhasm

TOP

你是意思是不要考虑前面到底有几个<dd>,只匹配最后一个的模式就好吧   (?:<dd[^>]*>\n"中 “?:”怎么解释

TOP

不论有多少个dd, 都会匹配的,要点在于只 捕获 最后一次的匹配。
?: 是“匹配但不捕获”,用来分组。
在答疑解惑版提问时,请注明所用语言、范例文本、匹配结果。谢谢!
------------------------------------------------------------------------------
我爱正则表达式
GTalk: rex[at]zhasm[dot]com
Twitter: rex_zhasm

TOP

返回列表