質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

1回答

219閲覧

Perl + html::TreeBuilder での値取得が期待通りにならない

kaneuchi

総合スコア12

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

1グッド

1クリップ

投稿2023/05/23 07:30

編集2023/05/23 08:48

実現したいこと

perl + html::TreeBuilder を使用した、Webサイトのスクレイピング。
取得したいサイトの情報/ソースには class や id などの目印がない状態。

取得したい値は<td></td>の間にセットされていてる値を取得したい。

前提

perl + html::TreeBuilder を使用して、Webサイトのスクレイピングをおこなっていますが、取得したいサイトの情報/ソースには class や id などの目印がない状態で、tdタグ内に1行でつめこまれています。

取得したい値は<td></td>の間にセットされていてる値を取得したい。

Webサイトのソースコード

<table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <td align="center" width="25%" valign="top"><a class="image" href="https://△.○○○/item_id/1001”><img src=“https://△.○○○/up/1001.jpg" border="0" alt=“商品A”></a><a href="https://△.○○○/item_id/1001”>商品A</a><a href="https://△.○○○/maker/9001”>X株式会社</a>1,200円</td> <td align="center" width="25%" valign="top"><a class="image" href="https://△.○○○/item_id/1002”><img src=“https://△.○○○/up/1002.jpg" border="0" alt=“商品B”></a><a href="https://△.○○○/item_id/1002”>商品B</a><a href="https://△.○○○/maker/9001”>X株式会社</a>1,000円</td> <td align="center" width="25%" valign="top"><a class="image" href="https://△.○○○/item_id/1003”><img src=“https://△.○○○/up/1003.jpg" border="0" alt=“商品C”></a><a href="https://△.○○○/item_id/1003”>商品C</a><a href="https://△.○○○/maker/9002”>Y株式会社</a>2,200円</td> <td align="center" width="25%" valign="top"><a class="image" href="https://△.○○○/item_id/1004”><img src=“https://△.○○○/up/1004.jpg" border="0" alt=“商品D”></a><a href="https://△.○○○/item_id/1004”>商品D</a><a href="https://△.○○○/maker/9002”>Y株式会社</a>1,800円</td> </tr> </table>

サイトの情報を次のイメージの内容で取得したいです。

[編集追記]
※URLはご指摘を受け修正しましたが、全角文字にしていますの動作に影響があるかは不明です

◆抽出したいイメージ(itemなどの項目名は説明のために記入、先頭の h は削除)
item : 商品A
Item_url : ttps://△.○○○/item_id/1001
Image_url : ttps://△.○○○/up/1001.jp
Maker_url : ttps://△.○○○/maker/9001
Maker_name : X株式会社
Price : 1,200円

item : 商品B
Item_url : ttps://△.○○○/item_id/1002
Image_url : ttps://△.○○○/up/1002.jp
Maker_url : ttps://△.○○○/maker/9001
Maker_name : X株式会社
Price : 1,000円

既に作成し利用しているコードを参考に新しいコードを作成してみましたが、希望通りの値を取得することができませんでした。既に作成していて動かしているコードは、取得したい値には class や id の目印となるものが付いていて問題なく取得ができています。

今回のようなサイトは初めてのためうまく値が取得できていません。

作成したソースコード(処理部分のみ抜粋)

$tree->parse_file("$file"); $tree->eof(); $tree->as_XML('&<>'), "\n"; foreach $td ($tree->find("td")) { #Aタグ抽出 if ($td->look_down('_tag', 'a')) { $product_info_wrk = ($td->look_down('_tag', 'a')->attr('href')); $product_text_wrk = ($td->look_down('_tag', 'a')->as_text); print $product_info_wrk, "\n"; print $product_text_wrk, "\n"; undef $product_info_wrk; undef $product_text_wrk; } if ($td->look_down('_tag', 'img')) { $img_wrk = ($td->look_down('_tag', 'img')->attr('src')); print $img_wrk, "\n"; undef $img_wrk; } if ($td->look_down('_tag', 'img')) { $img_alt_wrk = ($td->look_down('_tag', 'img')->attr('alt')); print $img_alt_wrk, "\n"; undef $img_alt_wrk; } }

コードを実行すると a タグは1回だけ、a タグで囲まれているテキストは取得ができずと、目的を達成することができませんん。どの様にすれば実現可能かお助けください。

◆実行結果
ttps://△.○○○/item_id/1001
<空白>
ttps://△.○○○/up/1001.jpg
商品A

ttps://△.○○○/item_id/1002
<空白>
ttps://△.○○○/up/1002.jpg
商品B

補足情報(FW/ツールのバージョンなど)

実行環境は次の通りです。
OS : linux
Perl : v5.26.3
html::TreeBuilder : 5.07

sigsegvを押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/05/23 07:46

foo.com は実在のドメインのようですが、ドメインの所有者や許可を得ていないのでしたら例示ドメインに置き換えてください。
kaneuchi

2023/05/23 08:50

ご連絡ありがとうございます。 よくサンプルで使用していましたが実在確認が漏れていました。 全角文字列に変更しました。
m.ts10806

2023/05/23 08:52 編集

「例示ドメイン」調べてみましょう。以下のような記事がすぐ見つかるはずです。 https://atmarkit.itmedia.co.jp/ait/articles/0610/07/news020.html ※細かいことかもしれませんが、セキュリティや相手への配慮などは絶対不可欠な要素です。 ※全角ドメインも取得可能なので、やはり例示としては避けるべきと
guest

回答1

0

look_down は配列を返すようなので、下記のような感じでは。

foreach my $td ($tree->find("td")) { foreach my $a ($td->look_down('_tag', 'a')){ my $href = $a->attr('href'); my $as_text = $a->as_text; } }

投稿2023/05/24 04:28

68user

総合スコア2005

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問