1

HTML コードを含む $html があります。HTML のどこかに、ID「コンテンツ」を持つ DIV があります。私の目標は、この DIV の HTML コンテンツを置き換えることです。このウェブサイトで、HTML を操作するときは、正規表現ではなくパーサーを使用するのが最善であると読みました。

私がこれまでに行ったこと(理想的なXPathを使用):

my $tree= HTML::TreeBuilder::XPath->new();
$tree->parse_content($html);
$content = $tree->findnodes_as_string('//div[@id="content"]');

これにより、置き換えたい DIV の HTML コンテンツ全体が得られますが、問題は、このコンテンツをどのように置き換えることができるかということです。私は試しました(しかしうまくいきませんでした):

$html =~ s/$content/$newhtml/mgs;

ご協力ありがとうございました。

4

3 に答える 3

3

Mojo::DOMは XPath の代わりに CSS セレクターをサポートしています。これは、HTML を操作するときにはるかに簡単だと思います。#contentこれにより、要素のコンテンツが in に置き換え$newhtmlられ$htmlます。

use Mojo::DOM;
my $dom = Mojo::DOM->new( $html );
$dom->at( '#content' )->replace_content( $newhtml );
print $dom;
于 2013-07-02T13:12:15.897 に答える
2

取得するのfindnodes_as_stringは単なる文字列でありHTML::Element、ドキュメントを保持するオブジェクトの一部ではありません。出力できるようにするには、オブジェクト自体を更新する必要があります。

要素を取得するには を使用する必要がありfindnodes(一致する要素のリストを取得し、そのリストの最初の要素を取得します)、 を使用してそのコンテンツを置き換えることができますreplace_with。にマークアップが含まれている場合(つまり、単純なテキスト コンテンツでない場合) にHTML::Elementオブジェクトを渡す必要がある場合があります。replace_with$newhtml

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder::XPath;

my $html=q{<html><head><title>foo</title></head>
                 <body><div id="title">foo</div>
                       <div id="content"><p>1 para</p><p>2 para's</p></div>
                 </body>
          </html>};

my $new_content='<div id="content"><p>new para 1</p><p>new para 2</p></div>';

my $tree= HTML::TreeBuilder::XPath->new();
$tree->parse_content($html);

# findnodes erturns a list of elements, take the first one
my $div = ($tree->findnodes('//div[@id="content"]'))[0];
# replace the div with an element created from $new_content
$div->replace_with( HTML::TreeBuilder->new_from_content( $new_content));

print $tree->as_HTML;
于 2013-07-02T12:58:49.557 に答える
0

$content正規表現パターンで特別な意味を持つ文字が含まれる場合があります。つまり、セット*+?|[]{}^$?

パターンを保持している変数のメタ文字をエスケープする方がよいでしょう:

$html =~ s/\Q$content\E/$newhtml/mgs;

(詳細はこちら)。

于 2013-07-02T12:35:44.317 に答える