こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perlテーブル要素の抜粋について

はじめまして、
わからないことがあるので教えてください;;

<table border="1">#1個目
<tr>
<th>No</th>
<td>1</td>
</tr>
<tr>

<th>名前</th>
<td>太郎</td>
</tr>
<tr>
<th>ランク</th>
<td>A</td>
</tr>
</table>

<table border="1">#2個目
<tr>
<th>住所</th>
<td>東京都渋谷...</td>
</tr>
<tr>
<th>電話番号</th>
<td>000-0000-000</td>
</tr>
</table>

<table border="1">#3個目
<tr>
<th>試験日</th>
<th>科目</th>
<th>参考資料</th>
<th>点数</th>
<th>順位</th>
</tr>
<tr>
<td>2015/6/25</td>
<td>国語</td>
<td><a href="kyouikunet.html"><img src="kokugo.gif" alt="kokugo"></a></td>
<td>70</td>
<td>12</td>
</tr>
<tr>
<td>2015/8/25</td>
<td>数学</td>
<td><a href="kyouikunet.html"><img src="sugaku.gif" alt="sugaku"></a></td>
<td>80</td>
<td>5</td>
</tr>
<tr>
<td>2015/10/25</td>
<td>理科</td>
<td><a href="kyouikunet.html"><img src="rika.gif" alt="rika"></a></td>
<td>75</td>
<td>8</td>
</tr>
<tr>
<td>2015/12/25</td>
<td>英語</td>
<td><a href="kyouikunet.html"><img src="eigo.gif" alt="eigo"></a></td>
<td>96</td>
<td>2</td>
</tr>
</table>

このような表があり、
$KojinSeisekiTroに入っており
その中の
テーブル1番目とテーブル3番目の情報の
[tb]内の文字列をカンマ区切りで保存したいのですが
どのようにするのかわからないです・・・

例)
この表ですと
1,太郎,A
2015/6/25,国語,70,12
2015/8/25,数学,80,5
2015/10/25,75,8
2015/12/25,96,2
.
.
.
以下、行の最終は不明なので、最後までという形

を、Tro.txtに保存したいです


どうかご教示お願い致します;;

投稿日時 - 2017-09-22 15:24:13

QNo.9377487

困ってます

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

HTML::TagParser を使うと楽に出来そうです。

まず、条件として1つ目と3つ目のテーブルにHTMLのClass名を設定します。

<table border="1" class="person">#1個目
<table border="1" class="result">#3個目

=============== 以下 Perl スクリプト =================
use HTML::TagParser;
$html = HTML::TagParser->new("table-parser-utf.html");
@person = $html->getElementsByClassName("person");
@result = $html->getElementsByClassName("result");

# 以下、1つ目のテーブルをCSVに整形
foreach ( @person ) {
$text = $_->innerText;
$text =~ s/(No|名前|ランク)(\r|\n)+//g;
$text =~ s/(\r|\n)+/\,/g;
$text =~ s/\s+\,//g;
print "$text\n"; # *1
}

#以下、3つ目のテーブルをCSVに整形
foreach ( @result ) {
$text2 = $_->innerText;
$text2 =~ s/(試験日|科目|参考資料|点数|順位)(\r|\n)+//g;
$text2 =~ s/(\r|\n)+/\,/g;
$text2 =~ s/\s+\,//g;
}
@text2 = split(/\,/,$text2);
$i = 1;
foreach (@text2) {
if ($i % 4 == 0) { $resultCsv .= "$_\n"; } # *1
else { $resultCsv .= "$_,"; }
$i++;
}
=================================================
参考までに
$text に「1,太郎,A」が入ります。
$resultCsvに「
2015/6/25,国語,70,12
2015/8/25,数学,80,5
2015/10/25,75,8
2015/12/25,96,2
」が入ります。

あとは上記を参考にカスタマイズすることで、ご希望の結果が得られると思います。
*1 : 改行コードはCSVの運用環境に応じて適宜使い分けてください。

投稿日時 - 2017-09-25 00:34:03

お礼

ありがとうございました!!

やりたいことができました!

投稿日時 - 2017-09-27 14:36:12

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

わたしもbakanandesuよー
こねくりまわすレネルなのね

use strict;
use warnings;

my $count_1 = 0;
my $count_2 = 0;
my $search = 3;
my $Log;

open KK,'table.txt';

while(<KK>){
chomp;
$count_1++ if $_ =~ m[^<table] ;
if( $count_1 == 1 or $count_1 == 3 ){
if( $_ =~ m[^<td>[^<]] ){
$_=~s[<.+?>][]g;
if( $count_2 != $search ){
$Log .= "$_,";
}else{
$search += 4;
$Log .= "\n$_,";
}
$count_2++;
}
}
}
close KK;

my @an = split(/\n/,$Log);

for(@an){
chop;
print"$_\n";
}

投稿日時 - 2017-09-23 21:25:06

ANo.1

こんにちは。
まず、ファイルの構成について教えてください。

提示された3つのテーブルは、1つのHTMLファイルに入っているのでしょうか?
あるいは3つのHTMLファイルに分割されているのでしょうか?

1つのHTMLファイルであれば、そのファイル内でのTABLEタグの登場回数は3回のみでしょうか?

投稿日時 - 2017-09-22 18:34:02

お礼

こんばんは
ご回答ありがとうございます!

1つのHTMLにテーブルはあります!
テーブル自体は他にも、複数あり
6~??と不確定要素であります…

投稿日時 - 2017-09-22 23:26:54

あなたにオススメの質問