求抽取新浪博客网页文章内容

辉歌 2008-05-08 01:40:51
3.博文能提出来吗?如这篇文章:
http://blog.sina.com.cn/s/blog_486e105c010095ej.html

如果帮忙抽出博文的话,想要抽出标题: 该强不强小心陷阱终被验证,时间,2008-05-07 15:06:22,分类:时政经济(缠中说禅经济学),标签:股票
和博文正文。
正文如果能有图片就更好了。

另外,前一帖子中,如果要抽出link的话,数据又不全了。
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
辉歌 2008-05-09
  • 打赏
  • 举报
回复
谢谢大哥。速度真快。
唉,新浪的留言格式居然又变了,真不是办法。谢谢大哥的耐心指点,我得自己学习走路了,不能老依靠别人。
iambic 2008-05-08
  • 打赏
  • 举报
回复
提取正文的代码:
use strict;
use LWP::Simple;

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

my ($title, $date, $tag, $category, $body);
if ($c =~ m!<div class="articleTitle">.*?</div>!s) {
($title, $date) = parseTitleDate($&);
}
if ($c =~ m!<div class="articleTag">.*?</div>!s) {
($tag, $category) = parseTagCategory($&);
}
if ($c =~ m!<div id="articleBody".*?</div>!s) {
$body = parseBody($&);
}

print "$title\n$date\n$tag\n$category\n";
print "$body\n";

sub parseTitleDate {
my $c = shift;
my $title = $1 if $c =~ m!>([^<>]*)</b>!;
my $date = $1 if $c =~ m!>\(([^<>]*)\)</span>!;
return ($title, $date);
}

sub parseTagCategory {
my $c = shift;
my $tag = $1 if $c =~ /\$tag='([^']*)'/;
my $category = $1 if $c =~ m!<td[^<>]*>[^<>]*(.*)</td>!;
$category =~ s/<[^<>]*>//g;
return $tag, $category;
}

sub parseBody {
my $c = shift;
$c =~ s/<(\S+)\s[^<>]*>/<\1>/g;
$c =~ s/\s//g;
$c =~ s!<p>(.*?)</p>!\1\n!gi;
$c =~ s!<br/?>!\n!gi;
$c =~ s/<[^<>]*>//g;
$c =~ s/ / /g;
return $c;
}

其实用正则表达式做已经比较勉强了。最好考虑用HTML库。
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;

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";
}
iambic 2008-05-08
  • 打赏
  • 举报
回复
>这样似乎不太利于程序员间的交流。我下载的很多书籍,还没有介绍这样的写法,脱离大众理解程度了。
一、如果你想学习Perl,请花三天时间把《Learning Perl》从头到尾读一遍。不要跳过任何内容。
二、如果你有UNIX经验,就会知道这种换分隔符的写法是很常见的。
另外我不知道你都下载了什么书。对我来说,《Learning Perl》、《Programming Perl》、《Perl Cookbook》和perldoc是第一手的材料。
辉歌 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iambic 的回复:]
替换。
s///g
s!!!g
s###g
s{}{}g
都是一样的。
看《Learning Perl》就会有介绍。
[/Quote]

这样似乎不太利于程序员间的交流。我下载的很多书籍,还没有介绍这样的写法,脱离大众理解程度了。

今天在下班回家的时候,突然也想到了,可能!就是/,因为!的个数刚好和/一样,并且格式一样。没想到还真是这么样的。
iambic 2008-05-08
  • 打赏
  • 举报
回复
替换。
s///g
s!!!g
s###g
s{}{}g
都是一样的。
看《Learning Perl》就会有介绍。
辉歌 2008-05-08
  • 打赏
  • 举报
回复
to iambic:
类似 这句,$c =~ s!<img\s[^<>]*/>!!g;其中的 s!是什么意思啊?我找了很多书籍,没有发现对这个的解释。
s应该是替换啊,替换应该是 s/p/t/ 的形式的。

37,721

社区成员

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

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