+ -
当前位置:首页 → 问答吧 → 网页抽取正则问题

网页抽取正则问题

时间:2010-12-17

来源:互联网

my $html = "<table><tr><td>aa</td><td>bb</td></tr></table>标记1<table><tr><td>cc</td><td>dd</td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";

我有这样一段网页代码,我想得到“标记1”后的td对,即:<td>cc</td><td>dd</td>,并装入数组@td,相当于
@td = ("<td>cc</td>","<td>dd</td>");

我以前都是分两次走,显然很啰嗦:
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $html = "<table><tr><td>aa</td><td>bb</td></tr></table>标记1<table><tr><td>cc</td><td>dd</td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";
  5. my ($need) = ($html =~ /标记1(.*?)标记2/i);
  6. my (@td) = ($need =~ /(<td>.*?<\/td>)/ig);
  7. print "@td";
复制代码
有没有办法一步做到?
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $html = "<table><tr><td>aa</td><td>bb</td></tr></table>标记1<table><tr><td>cc</td><td>dd</td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";
  5. my @td = ($html =~ /.*?标记1.*?(<td>.*?<\/td>)+/i);
  6. print "@td";
复制代码
尝试这样写,但只得到"<td>dd</td>"。

请精通正则的高手指教。

作者: iamlimeng   发布时间: 2010-12-17

那为何不用HTML::TreeBuilder 呢?一定要正则?

作者: x9x9   发布时间: 2010-12-17

本帖最后由 x9x9 于 2010-12-17 23:09 编辑

一定要两个标记之间的,如果用正则的话估计谁都得两步走吧?

作者: x9x9   发布时间: 2010-12-17

我已习惯了用正则,有空试试HTML::TreeBuilder 。

我这里只是举个例子,有些时候,数据不是网页,也有类似情况。

作者: iamlimeng   发布时间: 2010-12-17