-1

我正在构建一个应用程序来根据 linux 桌面环境中的关键词进行一些文本挖掘。我的目标是使用 wget 从 Wordpress 站点列表中下载网页,将页面保存到磁盘,然后将每篇文章分开以进行进一步处理。这个想法是我可以根据某些单词的频率对单个文章进行排名。Wordpress 博客中的文章倾向于遵循约定:

 <article></article> 

中间有实际的记录。到目前为止,我已经想出了类似这样的 perl 代码:

  $site = "somepage.somedomain"; #can be fed from a database later
  $outfile = "out1.txt"; #can be incremented as we go along
  $wgcommand = "wget --output-document $outfile $site";
  system($wgcommand);

  open SITEIN, '<', $outfile;
  @sitebodyarr = <SITEIN>;
  close SITEIN;

  $pagescaler = join('', @sitebodyarr); #let us parse the page.

  #this is where I have trouble. the though is to look for a mated pair of tags.
  #word press documents are stored between <article> and </article>

  $article =~ m/<article>*<\/article>/$pagescaler/g;

  #I put the /g flag there, but it doesn't seem to get me
  #what I want from the string - *ALL* of the articles one-by-one.

关于使此匹配从 html 文档返回的所有文章标记对集的任何想法?

如果无法使用正则表达式,我的下一个想法是对整个数组进行顺序处理,捕捉模式

   $line =~m/<article>/

然后启动一个字符串变量来保存文章内容。继续连接这个变量,直到我捕捉到模式

   $line =~m/<\/article>/

然后将字符串存储到我的数据库或磁盘中,然后重复直到@sitebodyarr 结束。但如果可能的话,我真的很喜欢单行正则表达式。如果是的话,有人可以告诉我它会是什么样子吗?

4

2 回答 2

2

查看Mojo 套件,其中包括华丽的模块,例如Mojo::DOM- 让网页抓取变得有趣和简单。

use strict; use warnings;
use feature 'say';
use Mojo;

my $ua = Mojo::UserAgent->new;
my $request = $ua->get('http://example.com/');
if (my $resp = $request->success) {
  my $dom = $resp->dom();
  for my $article ($dom->find('article')->each) {
    say "$article";
  }
}

# short version:

say for Mojo::UserAgent->new->get('http://example.com/')->res->dom('article')->each;

您可以使用 CSS 选择器来导航 DOM。

于 2013-10-27T09:42:02.260 回答
1

==>关于使这个匹配从 html 文档返回的所有文章标签对集的任何想法?

下面的代码将为您提供任何文章在 html 页面中出现的次数。

   #!/usr/bin/perl
    open $html_file_handle, "< $html_file";
    while(my $line=<$html_file_handle>) {
        if($line =~ /<article>(.+?)<\/article>/) {
            $counter_hash{$1}++;
        }
    }   
    foreach $article (keys %counter_hash) {
        print "$article  ==> $counter_hash{$article}\n";
    }
于 2013-10-27T03:39:22.590 回答