3
<div class="box notranslate" id="venueHours">
<h5 class="translate">Hours</h5>
<div class="status closed">Currently closed</div>
<div class="hours">
  <div class="timespan">
    <div class="openTime">
      <div class="days">Mon,Tue,Wed,Thu,Sat</div>
      <span class="hours"> 10:00 AM–6:00 PM</span>
    </div>
  </div>
  <div class="timespan">
    <div class="openTime">
      <div class="days">Fri</div>
      <span class="hours"> 10:00 AM–9:00 PM</span></div>
    </div>
    <div class="timespan">
      <div class="openTime">
        <div class="days">Sun</div>
        <span class="hours"> 10:00 AM–5:00 PM</span>
      </div>
    </div>
  </div>
</div>

<div class="days">すべてのとの内容をキャプチャしようとしてい<span class="hours">ます。このタスクでは正規表現を使用できると思います。しかし、このような特定の div ブロックをキャプチャする面白い方法や専門的な方法も学びたいと思っています。ありがとう。

4

3 に答える 3

7

他の場所で説明されている HTML 解析ライブラリに加えて、他のモジュールにも DOM 機能があります。例Web::Queryと Mojoliciousを参照してくださいMojo::DOM

Mojo::DOMCSS3 セレクターを使用した例を次に示します。

#!/usr/bin/env perl

use strict;
use warnings;

use 5.10.0;
use Mojo::DOM;

my $dom = Mojo::DOM->new(<<'HTML');
<div class="box notranslate" id="venueHours">
<h5 class="translate">Hours</h5>
<div class="status closed">Currently closed</div>
<div class="hours">
  <div class="timespan">
    <div class="openTime">
      <div class="days">Mon,Tue,Wed,Thu,Sat</div>
      <span class="hours"> 10:00 AM–6:00 PM</span>
    </div>
  </div>
  <div class="timespan">
    <div class="openTime">
      <div class="days">Fri</div>
      <span class="hours"> 10:00 AM–9:00 PM</span></div>
    </div>
    <div class="timespan">
      <div class="openTime">
        <div class="days">Sun</div>
        <span class="hours"> 10:00 AM–5:00 PM</span>
      </div>
    </div>
  </div>
</div>
HTML

say "div days:";
say $_->text for $dom->find('div.days')->each;

say "\nspan hours:";
say $_->text for $dom->find('span.hours')->each;

または同等:

say "div days:";
say for $dom->find('div.days')->map(sub{$_->text})->each;

say "\nspan hours:";
say for $dom->find('span.hours')->map(sub{$_->text})->each;

出力:

div days:
Mon,Tue,Wed,Thu,Sat
Fri
Sun

span hours:
 10:00 AM–6:00 PM
 10:00 AM–9:00 PM
 10:00 AM–5:00 PM

openTimesまたは、日に対応する時間を取得するには、 divの子を使用できます。

say "Open Times:";
say for $dom->find('div.openTime')
            ->map(sub{$_->children->each})
            ->map(sub{$_->text})
            ->each;

出力:

Open Times:
Mon,Tue,Wed,Thu,Sat
 10:00 AM–6:00 PM
Fri
 10:00 AM–9:00 PM
Sun
 10:00 AM–5:00 PM

編集: Daxim は類似のWeb::Queryコードをコメントとして投稿したので、より適切な書式設定のためにここに再投稿します。試したことはありませんが、彼のコードは一般的に信頼しています。HTML が変数にあると仮定します$html

use Web::Query qw(); 
my $w = Web::Query->new_from_html($html);
say "div days:";
say for $w->find('div.days')->text; 
say "\nspan hours:"; 
say for $w->find('span.hours')->text; 
say "Open Times:"; 
$w->find('div.openTime')->each(sub { say for $_->find('*')->text });
于 2012-05-20T15:14:07.927 に答える
3

このタスクに固有のモジュールを使用します: HTML::ParserHTML::Treeなど。

于 2012-05-20T14:39:36.430 に答える
-1

ステータス「現在休業中」に一致する正規表現:

/<\/h5><div[^>]*>([^<]*)/

一致する日:

/<div class="days">([^<]*)/

時間を一致させるには:

/<span class="hours">([^<]*)/
于 2012-05-20T14:40:36.693 に答える