2016-04-04 16 views
1

私は表抽出を使用して試してみましたが、私はこの(http://finance.yahoo.com/q/pr?s=yhoo)htmlファイルから..私は必要なものperlを使ってhtml内の特定の属性を持つ特定のタグに移動するには?

を取得していない午前私はどのテーブルのあるクラス=「yfnc_modtitlew1」とtdの中に存在している会社の住所を取得する必要がありますID = "yfncsumtab" あなたは、テーブルを反復処理する必要があり、事前

答えて

1

あなたのテーブルがTableExtractに適切なツールを作るように設定されているとは思いません。 TableExtractは本質的にテーブルをExcelスプレッドシートに変換し、行番号や列番号を使用してデータを取得します。 cell(0, 4)。あなたはid属性で行を選ぶことはできません。

TableExtractは、以下のようなテーブルのためのものです:

  Q1  Q2 Q3 
teamA  10  20 30 
teamB  40  50 60 
teamC  70  80 90 

は、実際には、ヤフーのHTMLコーダーは、非表形式データ用のテーブルを悪用している - しかし、ヤフーは古い学校です。

あなたこのようなあなたのhtmlにTableExtractを使用することができますので、しかし、あなたがターゲットとしている行は、表の2行目です:

use strict; 
use warnings; 
use 5.020; 
use LWP::Simple; 
use HTML::TokeParser::Simple; 
use HTML::TableExtract; 
use Data::Dumper; 

my $url = "http://finance.yahoo.com/q/pr?s=yhoo"; 
my $html_string = get($url) or die "Couldn't download webpage!"; 

my $target_table_id = "yfncsumtab"; 

my $table_extractor = HTML::TableExtract->new(
    attribs => { id => $target_table_id }, 
); 

$table_extractor->parse($html_string); 

my $table = $table_extractor->first_table_found() 
    or die "No matching tables!"; 

my $text = $table->cell(1, 0); #second row, first column 
my @lines = split "\n", $text, 5; 

for my $line (splice @lines, 0, 4) { 
    say $line; 
} 

__END__ 
Yahoo! Inc. 
701 First Avenue 
Sunnyvale, 
     CA 94089 
0

use LWP::Simple; 
use HTML::Parser; 
use HTML::TokeParser; 
use HTML::TableExtract; 

my $file= "Tickers\\EBAY\\EBAY_profile.html"; 

my $te = HTML::TableExtract->new(attribs => { id => "yfncsumtab" }); 
$te->parse_file($file); 
$te->tables; 
my @arr; 
foreach my $row ($te->rows) 
{ 
    push @arr,@$row; 
    print @$row ; 
} 

おかげで、その後、行:

foreach my $table ($te->tables) { 
    foreach my $row ($table->rows) { 
     push @arr, @$row; 
     print @$row; 
    } 
} 
1

片道は素晴らしいXML::LibXML moduleを経由しています。このモジュールでは整形式のXMLだけを受け入れると思うかもしれませんが、これも同様に優れていると説明されています。tutorialグラントマクリーン - ;

実際、パーサーには、閉じられていないタグ(<img><br>など)を処理するHTMLモードがあり、不良なHTMLによって引き起こされる解析エラーから回復することさえできます。

これを行うには、コンストラクタのrecoverフラグに真の値を渡します。

my $url = 'http://finance.yahoo.com/q/pr?s=yhoo' ; 
my $dom = XML::LibXML->load_html(
    location => $url , 
    recover => 1 , 
); 
say $dom->toStringHTML(); 

上記のスニペットを使用して、URLの正常なフェッチを確認できます。これにより、STDERRのエラーが発生します。データがあることを確認した後、出力をnullデバイス./script > /dev/nullにリダイレクトして、LibXMLがHTML内で見つかったエラーを確認できます。

メジャーが何も通過していないことを確認したら、suppress_errorsフラグをコンストラクタに追加し、XPATHクエリを使用して後のデータを引き出すことができます。

use v5.12; 
use XML::LibXML; 

my $url  = 'http://finance.yahoo.com/q/pr?s=yhoo' ; 
my $table_id = "yfncsumtab" ; 
my $td_class = "yfnc_modtitlew1" ; 
my $xpath = sprintf '//table[@id="%s"]//td[contains(@class, "%s")]' , 
         $table_id , $td_class ; 

my $dom = XML::LibXML->load_html(
    location => $url , 
    recover => 1 , 
    suppress_errors => 1 
); 
# say $dom->toStringHTML(); 

for my $td ($dom->findnodes($xpath)) { 
    say $_->textContent for $td->childNodes ; 
} 

これを詳細に説明するのではなく、もう一度Grantのチュートリアルを参照するよりもうまくできません。

関連する問題