作者 主題: PERL 正規表示式的問題  (閱讀 8185 次)

0 會員 與 1 訪客 正在閱讀本文。

jochang6

  • 憂鬱的高中生
  • ***
  • 文章數: 177
    • 檢視個人資料
PERL 正規表示式的問題
« 於: 2007-03-29 23:21 »
各位同好,
弟最近再做一份報告
請問個正規表示式的問題

在一堆網頁字串中,如以下
<div class="extended">
href="http://www.wretch.cc/blog/amarylliss&article_id=14371298#postComments"> href="http://www.wretch.cc/blog/amarylliss&article_id=14371298#trackbacks">
   </div> <!-- end of blogbody2 -->
         </div> <!-- end of blogbody -->
         <div class="date">
            <div class="datediv">
               March 27, 2007
            </div>
         </div>
            <div class="blogbody">
            <div class="blogbody2">

我用perl想把 herf= 之後的網址抓出來 該怎麼做呢?
一直抓不出來..... :(

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
PERL 正規表示式的問題
« 回覆 #1 於: 2007-03-30 01:08 »
既然已試過, 何不將你的方式先貼出來..

jochang6

  • 憂鬱的高中生
  • ***
  • 文章數: 177
    • 檢視個人資料
PERL 正規表示式的問題
« 回覆 #2 於: 2007-03-31 23:42 »
檔案如下:

#!/usr/bin/perl -w

sub geturl{

        use LWP::Simple;
      #取得該帳號首頁資料
        $userid = $_[0];
        $url = "http://www.wretch.cc/blog/$userid";
        $content = get $url;
        die "Couldn't get $url" unless defined $content;

        #把資料存到檔案中
        open CONTENT, "> $userid" or die "fail";
        print CONTENT $content;
        close CONTENT;

        #把檔案內容放到陣列中
        open FHD,"$userid" or die "fail";
        @all=<FHD>;
        }

#傳入帳號名到副程式geturl
$rt = &geturl("amarylliss");

#印出陣列前兩筆內容
print @all[0];
print @all[1];

--------------------------------------------------------
執行的結果:會把此帳號的網頁資料前兩行內容印出來,一行是空白,一行是<!DOCTYPE html PUBLIC 開頭那一行,如下

[root@home myperl]# perl f022.pl
Scalar value @all[0] better written as $all[0] at f022.pl line 24.
Scalar value @all[1] better written as $all[1] at f022.pl line 25.
Name "main::rt" used only once: possible typo at f022.pl line 23.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
註:前三行的警告訊息,不知道怎麼消除  :oops:
而我的問題目前應為:不知道怎樣比對陣列內容
我的想法是:如果我比對到herf=或http:就可以把我要的資料放到另一個陣列中
請大大們賜教。

anderson1127

  • 訪客
PERL 正規表示式的問題
« 回覆 #3 於: 2007-04-01 00:20 »
嗯.....

你要不要把那隻駱駝書拿來K一下,印像中是一開頭的部份,應該是第二章
有講Regular Expression的部份好好的唸一下... 然後配合實作LAB
你應該很容易可以做到這一點!!

以前我也有寫過一隻程式,專門把HTML檔裡的http那一個想要的string整個
取出來 , 那隻程式應該還在新竹某BBS裡 , 那隻程式是專門對付當時很流行
的美X圖用的 ( 當時寫這隻程式的需求就是這樣... :oops: )

jochang6

  • 憂鬱的高中生
  • ***
  • 文章數: 177
    • 檢視個人資料
PERL 正規表示式的問題
« 回覆 #4 於: 2007-04-08 00:16 »
概略的把要的東西抓出來了!但離我要的還差一點
程式碼如下:

#!/usr/bin/perl -w

sub geturl{

   use LWP::Simple;
   $userid = $_[0];
   $url = "http://www.wretch.cc/blog/$userid";
   $content = get $url;
   die "Couldn't get $url" unless defined $content;

   
   open CONTENT, "> $userid" or die "fail";
   print CONTENT $content;
   close CONTENT;


   open FHD,"$userid" or die "fail";
   @all=<FHD>;

### 比對陣列中的值,有符合 href= 的把後面的值印出來      
   foreach $all (@all){
      if($all =~ /href=/) {
                print "$'\n";
        }
   
   }
   

   close FHD;
   
    }

$rt = &geturl("amarylliss");


現在抓出來的會像這樣
"http://www.wretch.cc/blog/amarylliss&rss20=1" />

"http://pic51.pic.wretch.cc/photos/27/a/amarylliss/files/blog.css?1175947388" type="text/css" />

"http://pic.wretch.cc/photos/css/blog/font.css" type="text/css" />

"" title=""><a href="http://www.pala88.com" target="_blank">^M

"javascript:(function(){d=document;w=window;t='';if(d.selection){t=d.selection.createRange().text;}else{if(d.getSelection){t=d.getSelection();}else{if(w.getSelection){t=w.getSelection()}}}void(window.open('http://myshare.url.com.tw/index.php?func=newurl&from=mysharepop&url='+encodeURIComponent(location.href)+'&desc='+escape(document.title)+'&contents='+escape(t),'newwin','toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1,width=510,height=420'))})();">^M

可是只想要網址就好了
大大們!可以給點建議嗎?    :x

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
PERL 正規表示式的問題
« 回覆 #5 於: 2007-04-08 11:30 »
代碼: [選擇]
preg_match_all("'<a href=\"(.*?)\"'", $lines, $outs);


這是我用 PHP 抓的方式,

可以正確抓出雙引號裏的網址,

參考看看嘍  :wink:

anderson1127

  • 訪客
PERL 正規表示式的問題
« 回覆 #6 於: 2007-04-08 14:42 »
真是拿你沒辦法 , 好吧,我把當年我寫的Perl 程式給你參考!! 但是不負責幫你想辦法
修改程式,也不做說明 (既然會寫Perl , 就應該不用我多說了) , 這個程式就是我
在5-6年以前寫的吧?? 有點忘了...

代碼: [選擇]
#!/usr/bin/perl
$file = @ARGV[0];
open(FH1,"<$file");
while(<FH1>)
{
 if ($_ =~ /http:/)
  {
   if ($_ =~ /(^.*)(http.*)/)
    {
     if ( $2 =~ /(http:.*){1}">(.*)/)
      {
       print "$1\n";
      }
     else
      {
        if ( $2 =~ /(http:.*){1}>(.*)/)
          { print "$1\n";}
      }
    }
  }
}
close(FH1)


自己看看我的regular expression 是怎麼寫的吧!!

jochang6

  • 憂鬱的高中生
  • ***
  • 文章數: 177
    • 檢視個人資料
PERL 正規表示式的問題
« 回覆 #7 於: 2007-04-09 13:30 »
感謝學長提供的資料
小弟好好研究一下
 :)

jochang6

  • 憂鬱的高中生
  • ***
  • 文章數: 177
    • 檢視個人資料
PERL 正規表示式的問題
« 回覆 #8 於: 2007-04-17 13:14 »
用這種方式是可以寫出來,只是還有其他東西要抓,每抓一次要想一次挺麻煩的
在CAPN發現有現成的模組可用 HTML::Parser  :D
http://search.cpan.org/~gaas/HTML-Parser-3.56/Parser.pm
功能如名稱一樣,餵給它html檔
可以解析出需要的標籤內容

範例如下,要先準備好一個名稱為amarylliss的html檔
執行後印出內文中的網址

#!/usr/bin/perl -w

sub geturl{
        use HTML::Parser;
        $userid = $_[0];

        open FHD,"$userid" or die "fail";

        my $parser = HTML::Parser->new(api_version =>3);
        $parser->handler(start => \&print_link, 'tagname,attr');

     }

sub print_link {
        my ($tagname,$attr) = @_;
        if ($tagname eq 'a') {
                print "link:",$attr->{href},"\n";
                }
}

$rt = &geturl("amarylliss");

my $parser = HTML::Parser->new(api_version =>3);
$parser->handler(start => \&print_link, 'tagname,attr');

$parser->parse($_) while <FHD>;
$parser->eof;