• ベストアンサー

正規表現で指定範囲の文字列の取得

perlでRSSファイルを取得してTITLEタグの内容を抜き出したいのですが、 XML::RSSが使えない状況では、どのようにしたらいいでしょうか? my $document = LWP::Simple::get($url)後に正規表現で取り出して print タイトル<br>という風に表示しようと思っています。 よろしくお願いします。 ----下記のページを参考にしています。 http://www.itmedia.co.jp/enterprise/articles/0702/22/news014.html

  • Perl
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

正規表現で処理する前にutf-8をEUCに変換します。 Perlの正規表現はEUC以外では環境次第ですので動作保障が出来ません。 その後、全テキスト読み込み、「<title>」「<link>」タグの付いた行をそれぞれ配列「@T」「@L」に代入という前提で for(my $i=0; $i<=$#T; $i++){ $T[$i] =~ s/<title>(.+)<\/title>/$1/; $L[$i] =~ s/<link>(.+)<\/link>/$1/;   print '<a href="'.$L[$i]."'>".$T[$i]."</a><BR>\n"; } で抽出が完了すると思います。 タイトルだけならLINKの部分を取ってください。

bleacha
質問者

お礼

なるほど処理する文字コードの違いがでてくるわけですね。 正規表現でのマッチ方法も理解できました。 ソースを対応させて動かしてみます。 ありがとうございました。

その他の回答 (1)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 あくまでも参考程度ですが。 以下のスクリプトをutf-8Nで保存して ActivePerlで実行したら、  naoyaのはてなダイアリー  会社にお泊まり と表示されます。 #! /usr/bin/perl use strict; use warnings; use utf8; #>----下記のページを参考にしています。 #リンク先のxmlサンプルをコピペしました。 my $document = << "END_OF_DOCUMENT"; <?xml version="1.0" encoding="utf-8" ?> <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja"> <channel rdf:about="http://d.hatena.ne.jp/naoya/rss"> <title>naoyaのはてなダイアリー</title> <link>http://d.hatena.ne.jp/naoya/</link> <description>naoyaのはてなダイアリー</description> <items> <rdf:Seq> <rdf:li rdf:resource="http://d.hatena.ne.jp/naoya/20050330/1112136510"/> : : </rdf:Seq> </items> </channel> <item rdf:about="http://d.hatena.ne.jp/naoya/20050330/1112136510"> <title>会社にお泊まり</title> <link>http://d.hatena.ne.jp/naoya/20050330/1112136510</link> <description>夜遅かったので会社に泊まることにしました。</description> <dc:date>2005-03-30T07:48:30+09:00</dc:date> </item> END_OF_DOCUMENT my @titles = $document =~ /<title>([^<]*)<\/title>/ig; binmode STDOUT, ":encoding(shiftjis)"; print "$_\n" for @titles; exit; >print タイトル<br> この様子だとCGIだと思いますが、文字コードには 気をつけないといけませんね。 正規表現はあまり得意じゃないので、自信がありません。 あくまで参考程度に。

bleacha
質問者

補足

use utf8;での参考パターンですね。 文字列の取得方法も参考になりました。 ありがとうございます。

関連するQ&A

  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • LWPモジュールについて教えてください。

    プログラミングは初心者です。 LWPモジュールのサブクラスLWP::Simpleの get()という関数を使いたいです。 現在、Perlは5.005_3を使用しています。 use LWP::Simple; require LWP::Simple; ・ get(URL) と入れると、500 Internal Server Errorと言うものが出てしまいます。 LWPを使うとき、どのようにすれば使えるのかご指導お願いいたします。

    • ベストアンサー
    • Perl
  • Java正規表現-"ある文字列"を含まない文字列

    Javaの正規表現で、HTMLタグ以外の文字列を抽出しようとしています。 HTMLタグはの正規表現は"(</?.*>)"のように表しました。これの否定をしたいのですが、方法を教えて下さい。HTMLタグ以外にヒットさせたいです。 一応、現段階のソースを載せます。 import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HTMLInnerGetter { public static void main(String[] args){ String regex = "(</?.*>)"; String target = "<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>"; ArrayList<String> innerHTMLs = new ArrayList<String>(); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(target); while(matcher.find()){ innerHTMLs.add(matcher.group(1)); } System.out.println(innerHTMLs); } } 出力結果 [<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>] ※否定できなかったので、HTMLタグがヒットしています。

    • ベストアンサー
    • Java
  • PHPでXMLから正規表現で特定の要素を抜き出しているんですが‥。

    このようなXMLがあったとします。 sample.xml ---------------------------- <rss> <xml> <title>タイトル</title> <link>ttp://xxx.jp/</link> </xml> </rss> ---------------------------- ここから <xml> ~ </xml> の部分だけを抜き出すのですが、 $data = file_get_contents("sample.xml"); preg_match_all("|<xml>((?:(?!</xml>).)*)</xml>|si", $data, $matchs); で、$matchs[1] の中に <xml> ~ </xml> の部分が配列で入っています。 この『((?:(?!</xml>).)*)』の部分の意味がよく分かりません。 これは先輩から教えてもらった構文ですが、先輩に聞いても詳しい意味を知らないそうです。 『? ! . *』の意味は理解しているけど『:』は参考書でもよく分かりませんでした。 ネットを少し検索したけどこの取得構文の解説が見つからないため質問します。 simpleXML のようなクラスを使わずに、他にも正規表現で XML から要素を取得できる簡単な方法をご存知の方がいましたらどうか教えてください。 急ぎではありませんのでよろしくお願いします。

    • ベストアンサー
    • PHP
  • XML::RSS文字コード統一の仕方がわかりません

    perl初心者です。 rssを取得して簡易ブログパーツをつくりたいのですが文字コードでうまいこといかず悪戦しています。 以下がコードです。(きたなくてすいません…) #!/usr/bin/perl use LWP::Simple; use XML::RSS; use utf8; use open ":utf8"; $logfile="./syoukai.log"; open(DAT, "$logfile"); @log=<DAT>; close(DAT); my $rss = new XML::RSS; @list = (); foreach(@log){ ($nom,$name,$prof,$xml,$btitle,$ktitle,$klink)=split(/<>/); eval { $rss->parse( LWP::Simple::get($xml) ); }; if($@) { next; } $btitle = $rss->{'channel'}->{'title'}; $prof = $rss->{'channel'}->{'link'}; $item = $rss->{'items'}; $line = @{$item}[0]; $ktitle = $line->{'title'}; $klink = $line->{'link'}; $date = $line->{'pubDate'}; push(@list, "$date<>$name<>$prof<>$xml<>$btitle<>$ktitle<>$klink<>\n"); } open(IN,">$logfile"); print IN @list; close(IN); exit; syoukai.logを呼び出して そこに書かれたxmlを順番に読み込んで ファイルを更新したいのですが これだと何もいじっていない$nameは大丈夫なんですが $btitleや$ktitleが文字化けしてファイルに書かれてしまいます…。 use utf8;ではなく use encoding 'UTF-8', STDOUT => 'cp932';としたら 今度は$nameだけ文字化けしてしまいます。 別々の文字コードを一緒にしてしまってるからだと思うのですが どれがどの文字コードなのかがわからないでいます。 文字コードを統一する方法などがあれば教えてくださいm(__)m 説明&記述ヘタですいません…。 宜しくお願いします。

  • Perlでgoogle newsのRSSを取得2

    質問を閉め切った直後に気付いたもので、すいません!! QNo.3797932の、つづきなのですが、、、 教えていただいた以下の方法 ------------------------- #!/usr/local/bin/perl use LWP::Simple; use XML::RSS; use LWP::UserAgent; my $url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko'; my $ua = new LWP::UserAgent; my $responce = $ua->get($url, 'User-Agent' => 'Mozilla/4.0'); my $data_from_web = $responce->content; print <<"HTML"; Content-type: text/html <html> HTML print $data_from_web; exit; ------------------------- の場合だと、ページ表示データは取得できるのですが、RSS特有のタグが 抜け落ちる為、その後の解析ができない事に気付きました。 なんとか、RSS特有のタグも含めてのRSS情報を入手する方法はないでしょうか? ちなみに、RSS特有のタグも含めてのRSS情報は、ブラウザーのURLの窓に http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko このアドレスを直接入力してリターンキーを押すと、確認する事ができます。 度々申し訳ないのですが、よろしくご指導、お願い致します。

    • ベストアンサー
    • Perl
  • スリーエフのSuicaについて

    http://www.itmedia.co.jp/enterprise/mobile/articles/0512/07/news042.html 2006年の秋までにSuicaが使えるとありますが、 具体的にはいつまでに使えるようになるのでしょうか?

  • [wordpress]外部RSSを「文字数制限」してリストで取得[php]

    初めまして。 wordpress、php初心者です。 タイトル通り、外部のRSSを自分のサイトで、 リスト表示させようと思っています。 ------------ <h1><?php _e('Headlines from Yahoo ITmedia News'); ?></h1> <?php // Get RSS Feed(s) include_once(ABSPATH . WPINC . '/rss.php'); $rss = fetch_rss('http://headlines.yahoo.co.jp/rss/itmedia_n.xml'); $maxitems = 5; $items = array_slice($rss->items, 0, $maxitems); ?> <ul> <?php if (empty($items)) echo '<li>No items</li>'; else foreach ( $items as $item ) : ?> <li><a href='<?php echo $item['link']; ?>' title='<?php echo $item['title']; ?>'> <?php echo $item['title']; ?> </a></li> <?php endforeach; ?> </ul> ------------ 上記のソースで表示はひとまずできました。 あと、これを文字数制限(たとえば10文字以上は「…」)で表示 としたいのですが、どうしたらいいのでしょうか? ------------ <?php $title= mb_substr($post->post_title,0,10); echo '<h1>'.$title.'…</h1>'; ?> ------------ 上記の「mb_substr(」を組み合わせればできそうなのですが、 理解不足な分、うまくいきません。 誰が、教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • alarmのタイムアウト後の処理でスクリプトを止めない方法をご教授ください

    はじめまして。 現在perlで簡単なRSSリーダーを作っています。 簡単に書けば下記のようなスクリプトです。 use LWP::Simple; use XML::RSS; foreach(@hoge) { # @hogeはrssファイルのURL $SIG{ALRM} = sub{ die("alarm_error"); }; alarm 10; $rss->parse($_); alarm 0; } rssファイルをとりにいって10秒たって取得できなければnextで次のrssファイルへという形にしたいのですがどうもやり方がわかりません。 いろんなところで調べてもタイムアウト後はdie等によって強制終了するやり方しか見つかりませんでした。 タイムアウト後nextを使えるやり方をご存知のかたおられたらお教えください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • タグを正規表現で完全に削除

    こんばんわ~ときどきこちら様でお世話になってます タグ(Java ScriptやHTML中のCSS等きわめて複雑なものも含む)を完全に削除してウェブサイトの文字だけを抜き出したいんですけど自分にはハードルが高すぎたみたいです^^; http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag いろいろ調べているうちにこちらのサイト様を発見し、 $none_tag =~ s/$tag_regex//; とやってみましたがなぜかタグが残ってしまいます。 とあるサイトの【文字】だけを抜き出せれば良いのでタイトルに正規表現と記載しましたがその他の方法でも構いませんのでよろしくお願いしますm(_ _)m

    • ベストアンサー
    • Perl

専門家に質問してみよう