1

PHPを使用したWebスクレイピングのチュートリアルに従おうとしています。

何が起こっているのか大まかに理解していますが、スクレイピングされたものをフィルタリングして、必要なものを正確に取得する方法がわかりません。例えば:

<?php
$file_string = file_get_contents('page_to_scrape.html');
preg_match('/<title>(.*)<\/title>/i', $file_string, $title);
$title_out = $title[1];
?>

はタイトル タグの間のすべてを取得するようですが(.*)、正規表現を使用して特定の情報を取得できますか。彼のタイトルの中でWelcome visitor #100、ハッシュの後に来る番号をどのように取得するとしますか?

または、タグ間のすべてを取得して、後で操作する必要がありますか?

4

3 に答える 3

3

タイトルが「ようこそビジター #100」で、<title>タグが 1 回しか出現しないという事実を考えると、式は次のようになります。

preg_match('~<title>Welcome visitor #(\d+)</title>~', ...);

SO の多くの人々は、正規表現を使用して (X)HTML を解析しないと主張するでしょう。ただし、このタスクでは、上記で十分です。

前述のように、<title>タグは 1 回しか出現しない (べきである) が、パターン

<title>(.*)</title>

これにも一致します:

<title>Welcome visitor <title>#<title>100blafoobar</title>

(.*)これを可能にする部分です。データをスクレイピングしているページが変更されるとすぐに、正規表現が機能しなくなる可能性があります。


編集:複数の要素とその属性を正しく選別する方法:

$dom = new DomDocument;
$dom->loadHTML($page_content);

$elements = $dom->getElementsByTagName('a');

for ($n = 0; $n < $elements->length; $n++) {
    $item = $elements->item($n);
    $href = $item->getAttribute('href');
}
于 2012-02-23T00:13:15.880 に答える
2

必要なものに合わせて正規表現を変更するだけです。タイルを複数回使用する場合は、全体を保存して後で操作することをお勧めします。それ以外の場合は、必要なものだけを入手してください。

/<title>.*((?<=#)\d*).*<\/title>/i

具体的には、ハッシュ後の数値に一致します。ハッシュのない数値とは一致しません。

正規表現を記述する方法はたくさんありますが、どれだけ一般的または具体的にしたいかによって異なります。

次のように記述して、任意の数値を取得することもできます。

/<title>.*(\d)*.*<\/title>/i

于 2012-02-23T00:16:46.370 に答える
0

最初にタイトル タグを取得してから、タイトルをさらに処理します。他の回答には、このタスクの完全に有効なソリューションが含まれています。

さらにいくつかの注意事項:

  • そのような場合は DOMDocument を使用してください。より安全です (特定の HTML ページで正規表現が壊れる可能性があります)。
  • 貪欲でないバージョンの.*:.*?を使用してください。そうしないと、次のようなおかしなことに遭遇します。

    <html>
        <head>
            <title>a</title>
        </head>
        <body>
            <title>test</title> <!-- not allowed in HTML, but since when does the web pages online actually care about that? -->
        </body>
    </html>
    

までの間のすべてを含め、<title>a</title>...までのすべてを一致させます。<title>test</title>

于 2012-02-23T16:22:06.103 に答える