私は表抽出を使用して試してみましたが、私はこの(http://finance.yahoo.com/q/pr?s=yhoo)htmlファイルから..私は必要なものperlを使ってhtml内の特定の属性を持つ特定のタグに移動するには?
を取得していない午前私はどのテーブルのあるクラス=「yfnc_modtitlew1」とtdの中に存在している会社の住所を取得する必要がありますID = "yfncsumtab" あなたは、テーブルを反復処理する必要があり、事前
私は表抽出を使用して試してみましたが、私はこの(http://finance.yahoo.com/q/pr?s=yhoo)htmlファイルから..私は必要なものperlを使ってhtml内の特定の属性を持つ特定のタグに移動するには?
を取得していない午前私はどのテーブルのあるクラス=「yfnc_modtitlew1」とtdの中に存在している会社の住所を取得する必要がありますID = "yfncsumtab" あなたは、テーブルを反復処理する必要があり、事前
あなたのテーブルが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
で
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;
}
}
片道は素晴らしい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のチュートリアルを参照するよりもうまくできません。