0

次のような URL を含む html ページがあります。

<h3><a href="http://site.com/path/index.php" h="blablabla">
<h3><a href="https://www.site.org/index.php?option=com_content" h="vlavlavla">

抽出したい:

site.com/path
www.site.org

<h3><a href="&の間/index.php

私はこのコードを試しました:

#!/usr/local/bin/perl
use strict;
use warnings;

open (MYFILE, 'MyFileName.txt');
while (<MYFILE>) 
{
  my $values1 = split('http://', $_); #VALUE WILL BE: www.site.org/path/index2.php
  my @values2 = split('index.php', $values1); #VALUE WILL BE: www.site.org/path/ ?option=com_content

    print $values2[0]; # here it must print www.site.org/path/ but it don't
    print "\n";
}
close (MYFILE);

しかし、これは出力を与えます:

2
1
2
2
1
1

また、https Web サイトを解析しません。よろしくお願いします。

4

3 に答える 3

0

dmsは、ここで使用することが最善の解決策ではない理由を彼の回答で説明しました。split

  • スカラーコンテキストでアイテムの数を返します
  • このタスクには、通常の正規表現の方が適しています。

ただし、入力の行ベースの処理が HTML に対して有効である、または置換を使用することが意味があるとは思いません (特にパターンが のように見える場合はそうではありません.*Pattern.*)。

URL を指定すると、次のような必要な情報を抽出できます。

if ($url =~ m{^https?://(.+?)/index\.php}s) {  # domain+path now in $1
  say $1;
}

しかし、どうやって URL を抽出するのでしょうか? 素晴らしいモジョリシャス スイートをお勧めします。

use strict; use warnings;
use feature 'say';
use File::Slurp 'slurp';  # makes it easy to read files.
use Mojo;

my $html_file = shift @ARGV;  # take file name from command line

my $dom = Mojo::DOM->new(scalar slurp $html_file);

for my $link ($dom->find('a[href]')->each) {
  say $1 if $link->attr('href') =~ m{^https?://(.+?)/index\.php}s;
}

このfindメソッドは、CSS セレクター (ここでは、属性aを持つすべての要素) を取ることができます。hrefeach、結果セットをループできるリストにフラット化します。

STDOUT に出力するときに、シェルのリダイレクトを使用して出力を必要なファイルに入れることができます。

$ perl the-script.pl html-with-links.html >only-links.txt

ワンライナーとしてのスクリプト全体:

$ perl -Mojo -E'$_->attr("href") =~ m{^https?://(.+?)/index\.php}s and say $1 for x(b("test.html")->slurp)->find("a[href]")->each'
于 2013-08-18T10:18:35.823 に答える