3

Web ページのスクレイピングを含む PHP スクリプトを作成しています。現在、スクリプトはページを 1 行ずつ分析しますが、次のように複数行にまたがるタグがあると壊れます。

<img src="example.jpg"
alt="example">

最悪の場合、すべての改行を削除してページを前処理し、最も近い位置に再挿入することもできます>が、これは面倒なようです。

理想的には、複数の行にまたがるタグを検出し、それらのみを行に結合して、処理を続行できます。
では、これを検出するための最良の方法は何ですか?

4

6 に答える 6

7

これは私の苦手なことの 1 つです。HTML を手動で解析しないでください。HTML を正規表現で解析しないでください。文字列比較で HTML を解析しないでください。HTML を解析するには、常にHTML パーサーを使用してください。それが目的です。

PHP をやったのは久しぶりですが、簡単な検索でこの PHP5 HTML パーサーが見つかりました。

于 2008-08-29T02:19:03.817 に答える
2

パーサーを書くのではなく、他の誰かのものを使用してください: DOMDocument::loadHTML - これは 1 つにすぎません。他にもたくさんあると思います。

于 2008-08-29T02:21:59.470 に答える
1

まあ、これは質問への回答ではなく、むしろ意見ですが...

私は、最善のスクレイピング戦略 (そして結果としてこの問題を解消するため) は、HTML にとって不自然な行ごとに HTML を分析するのではなく、その自然な区切り文字である <> ペアで分析することだと思います。

コースは以下の2種類になります。

  • < br /> のように、すぐに閉じられるタグ要素
  • < p > テキスト < /p > など、別の終了タグが必要なタグ要素

段落 (p) タグの場合にこの戦略を使用する利点はすぐにわかります。終了タグがどこにあるかを追跡する代わりに、複数の段落を解析する方が簡単です。

于 2008-08-29T02:16:53.290 に答える
1

おそらく将来のプロジェクトでは解析ライブラリを使用するでしょうが、それは当面の問題とは別の話です。これが私の現在の解決策です。rstrposstrpos ですが、逆方向からです。使用例:

for($i=0; $i<count($lines); $i++)
{
    $line = handle_mulitline_tags(&$i, $line, $lines);
}

そして、これがその実装です:

function rstrpos($string, $charToFind, $relativePos)
{
    $searchPos = $relativePos;
    $searchChar = '';

    while (($searchChar != $charToFind)&&($searchPos>-1))
    {
        $newPos = $searchPos-1;
        $searchChar = substr($string,$newPos,strlen($charToFind));
        $searchPos = $newPos;
    }

    if (!empty($searchChar))
    {
        return $searchPos;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

function handle_multiline_tags(&$i, $line, $lines)
{
    //if a tag is opened but not closed before a line break,

    $open = rstrpos($line, '<', strlen($line));
    $close = rstrpos($line, '>', strlen($line));
    if(($open > $close)&&($open > -1)&&($close > -1))
    {
        $i++;
        return trim($line).trim(handle_multiline_tags(&$i, $lines[$i], $lines));
    }
    else
    {
        return trim($line);
    }
}

これはおそらく何らかの方法で最適化される可能性がありますが、私の目的には十分です。

于 2008-08-29T16:20:57.163 に答える
0

現在の解析方法に固執する必要があり、それが正規表現である場合は、複数行フラグ「m」を使用して複数行にまたがることができます。

于 2008-08-29T16:18:16.423 に答える
0

行を読み取って文字列に設定し、タグの開始と終了の文字列を確認してください。タグが複数の行にまたがる場合は、次の行を文字列に追加し、左中括弧の前の部分を移動します処理された文字列に。次に、これを実行してファイル全体を解析します。美しくはありませんが、うまくいくはずです。

于 2008-08-29T02:42:35.570 に答える