完全新手,请教前辈如何用 PERL提取以下网页内容?

辉歌 2008-04-23 01:11:19
我手上有一个现成的下载新浪博客留言的perl程序,但是新版博客留言格式修改过了。所以就一筹莫展。求前辈帮忙。
第一段:

<div class="citem" id="cmt_879662">
<!--<span class="num floatLeft">2</span>-->
<div class="userInfo floatLeft">
<div class="photo"><img src="comment_486e105c010090eo_1_files/default.gif" height="50" width="50"></div>
新浪网友
</div>
<div class="leave floatLeft">
<div>这不是真的,不是真的,你在开玩笑!!!!!!!</div>
<span class="time">(2008-04-22 19:09:46)</span>
<div class="commentFrom"></div>
</div>
</div>
其中,<div class="userInfo floatLeft">为用户名开始的标志。要求能提取出 新浪网友
<div class="leave floatLeft">应该是留言的开始标志。 要求能提取出 这不是真的,不是真的,你在开玩笑!!!!!!!
<span class="time">是时间,提取出 2008-04-22 19:09:46

===================
第二段:

<div id="articleBody" class="articleContent">
<DIV>。。。。。。</div>
<div>
能提取出 <DIV>。。。。。。</div>中的内容。如:
<div id="articleBody" class="articleContent">
<DIV align=center>                                                                    </DIV>
<DIV align=center><IMG src="http://www.newsyc.com/xwzx/sjxw/images_1/2005/12/14/49094.jpg">                                                                                                                                       </DIV>
<DIV align=center><FONT size=3> 郑和</FONT><FONT size=3><BR>   <BR>郑和七下卅万里, <BR>   </FONT></DIV>
<DIV align=center><FONT size=3>怒海空翻六百年。 <BR>   <BR>星岛斑斓仍雨露, <BR>   </FONT></DIV>
<DIV align=center><FONT size=3>舟师杳渺只云烟。 <BR>   <BR>两朝异梦秦徐福, <BR>   <BR>万世同功汉马迁。 <BR>   <BR>霸业今惟新大陆, <BR>   <BR>宝船不见尽楼船。 <BR></DIV></FONT>
<DIV align=center><FONT size=3></FONT> </DIV>
<DIV align=center><FONT size=3></FONT> </DIV>
<DIV align=center><FONT size=3>     金沙 <BR><BR>天泻长江波万里, <BR><BR> 缺山开野流不止。 <BR><BR> 龙腾六合战尘寰, <BR><BR> 血溅空魂偏日轨。 <BR><BR> 碎甲沉沙幻彩章, <BR><BR> 凉光透浪飞红鲤。 <BR><BR> 往来淘者渺无归, <BR><BR> 白雾青烟朝夕诡。 </FONT></DIV>
<P align=center><FONT size=3>     </FONT></P>
<P align=center><FONT size=3>       东南</FONT></P><FONT size=3>
<DIV align=center><FONT size=3> 东南万里海浮天,</FONT></DIV>
<DIV align=center> </DIV>
<DIV align=center><FONT size=3> 一裂金瓯百五年。</FONT></DIV><FONT size=3>
<DIV align=center><BR> 未葬鱼龙今古血,</FONT></DIV>
<DIV align=center> </DIV>
<DIV align=center><FONT size=3> 翻生蛤蜃晓昏烟。</FONT></DIV><FONT size=3>
<DIV align=center><BR> 华夷衰盛忝唐杰,</DIV>
<DIV align=center> </DIV>
<DIV align=center> 风雨苍黄思郑贤。</DIV>
<DIV align=center><BR> 十亿神州重抖擞,</DIV>
<DIV align=center> </DIV>
<DIV align=center> 昆仑拔掷浪波填。</FONT></DIV>
<DIV align=center><BR></DIV></FONT>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
<DIV></DIV>
</div>
...全文
883 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
辉歌 2008-05-08
  • 打赏
  • 举报
回复
如果帮忙抽出博文的话,想要抽出标题: 该强不强小心陷阱终被验证,时间,2008-05-07 15:06:22,分类:时政经济(缠中说禅经济学),标签:股票
和博文正文。
正文如果能有图片就更好了。
辉歌 2008-05-08
  • 打赏
  • 举报
回复

楼上的强人啊强人。好人做到底吧!送佛送到西,再帮帮忙好吗?

1.$c =~ s!<img\s[^<>]*/>!!g;这些是什么意思呢?如果要看书的话,应该是看字符串处理部分?还是正则表达式部分?

2.留言基本上非常完美了,还能不能帮忙提取出留言中有博客地址的用户名的博客地址啊?如 “溪水边的青草地”,这个名字是有博客的,能提出来吗?

3.博文能提出来吗?如这篇文章:
http://blog.sina.com.cn/s/blog_486e105c010095ej.html

我用wget已经把所有的文章和留言下载下来了,但是还是不会提出想要的内容。看了两天perl的书,对perl的奇怪的字符串处理方式转不过弯来。谢谢大哥了。
iambic 2008-05-08
  • 打赏
  • 举报
回复
加了一行:
use strict;
use LWP::Simple;

my $c = get('http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html');
$c =~ s!<img\s[^<>]*/>!!g;
$c =~ s!<div class="photo">.*?</div>!!g;
$c =~ s!<a\s[^<>]+>([^<>]*)</a>!\1!g;

while ( $c =~ m!<div class="userInfo[^<>]*>\s*([^<>]+?)\s*</div>\s*<div[^<>]*>\s*<div>([^<>]*?)</div>\s*<span[^<>]*>\(([^<>]*)\)</span>!g) {
my $user = $1;
my $message = $2;
my $time = $3;
print "$user\n$time\n$message\n\n";
}
辉歌 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iambic 的回复:]
Perl codeusestrict;useLWP::Simple;my$c=get('http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html');$c=~s!<img\s[^<>]*/>!!g;$c=~s!<div class="photo">.*?</div>!!g;while($c=~m!<div class="userInfo[^<>]*>\s*([^<>]+?)\s*</div>\s*<div[^<>]*>\s*<div>([^<>]*?)</div>\s*<span[^<>]*>\(([^<>]*)\)</span>!g) {
my $user = $1;
my $message = $2;
my $time = $3;
print"$user\n$time\n$message\n\…
[/Quote]

大哥太强悍了。连下载都自动搞定了。perl对付字符串可真是没得说的。

有些小问题,抽取出来的数据不全。
iambic 2008-05-08
  • 打赏
  • 举报
回复
原来的代码确实有问题……又改了下:
use strict;
use LWP::Simple;

my $c = get('http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html');
$c =~ s!<img\s[^<>]*/>!!g;
$c =~ s!<div class="photo">.*?</div>!!g;
#$c =~ s!<a\s[^<>]+>([^<>]*)</a>!\1!g;

while ( $c =~ m!<div class="userInfo[^<>]*>\s*(<a\s[^<>]+>)?([^<>]+?)(?:</a>)?\s*</div>\s*<div[^<>]*>\s*<div>([^<>]*?)</div>\s*<span[^<>]*>\(([^<>]*)\)</span>!g) {
my $user = $2;
my $message = $3;
my $time = $4;
my $link = $1;
$link = $1 if $link =~ /href="([^"]*)"/;
print "$user\n$link\n$time\n$message\n\n";
}
辉歌 2008-05-08
  • 打赏
  • 举报
回复
感谢大哥慷慨帮助。结贴。再开贴。
iambic 2008-05-08
  • 打赏
  • 举报
回复
1. 正则表达式替换。用处是把这样的标签去掉:
<img src='http://blogimg.sinajs.cn/v5images/default.gif' width='50px' height='50px' />


2. 地址加上了:
use strict;
use LWP::Simple;

my $c = get('http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html');

$c =~ s!<img\s[^<>]*/>!!g;
$c =~ s!<div class="photo">.*?</div>!!g;
#$c =~ s!<a\s[^<>]+>([^<>]*)</a>!\1!g;

while ( $c =~ m!<div class="userInfo[^<>]*>\s*(<a\s[^<>]+>)?([^<>]+?)(?:</a>)?\s*</div>\s*<div[^<>]*>\s*<div>([^<>]*?)</div>\s*<span[^<>]*>\(([^<>]*)\)</span>!g) {
my $link = $1;
$link = $1 if $link =~ /href="([^"]*)"/;
my $user = $2;
my $message = $3;
my $time = $4;
print "$user\n$link\n$time\n$message\n\n";
}


3. 这个是另外一个问题,需要花点时间。我可能要明天或者后天才能抽时间看看。建议你单独发一个贴子,最好是1分贴,不然我可能就忘了。

4. 建议楼主先把《Learning Perl》从头到尾读一遍。

iambic 2008-05-07
  • 打赏
  • 举报
回复
use strict;

use LWP::Simple;

my $c = get('http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html');
$c =~ s!<img\s[^<>]*/>!!g;
$c =~ s!<div class="photo">.*?</div>!!g;
while ( $c =~ m!<div class="userInfo[^<>]*>\s*([^<>]+?)\s*</div>\s*<div[^<>]*>\s*<div>([^<>]*?)</div>\s*<span[^<>]*>\(([^<>]*)\)</span>!g) {
my $user = $1;
my $message = $2;
my $time = $3;
print "$user\n$time\n$message\n\n";
}

辉歌 2008-05-07
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/comment_486e105c010095ej_2.html

就是将上面网页的内容提取出来。

我已经把网页下载到本地了。
辉歌 2008-05-06
  • 打赏
  • 举报
回复
谢谢楼上的回复。

缘由是这样的,网上已经有一个现成的可以下载新浪博客文章及留言的perl程序。但是现在新浪博客升级了,原来的程序不能用了。
我想:
1,下载博客文章
2,下载留言
3,从这些留言中抽取指定用户名的留言。

UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
我也想了解,谢谢LZ.
iambic 2008-04-25
  • 打赏
  • 举报
回复
发个链接出来。直接在这里贴HTML代码不好测试。
jiuchang 2008-04-25
  • 打赏
  • 举报
回复
你要从第二段中提取出什么内容
DDGG 2008-04-25
  • 打赏
  • 举报
回复
用模式匹配,比如取出“新浪网友”:


my $html = qq~ <div class="userInfo floatLeft">
<div class="photo"> <img src="comment_486e105c010090eo_1_files/default.gif" height="50" width="50"> </div>
新浪网友
</div> ~;

if ($html =~ /<div class="userInfo floatLeft">.*?<\/div>\s*(.*?)\s*<\/div>/is)
{
print $1;
}
辉歌 2008-04-23
  • 打赏
  • 举报
回复
第二段起始和结束标志
<div id="articleBody" class="articleContent">
。。。。。。。。。。。。。。。。

<div class="articleInfo">
刚才想了下,这两个标志比较容易抽取内容。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

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