1

C# で div 要素全体をスクレイピングしようとしています...

試してみましたが div class="txt-block"\s*(.+?)(\r\n?|\n)\s*"、全体をこすり落とすことはできません:(何かアイデアはありますか?ここにdivがあります..THX!

    <div class="txt-block" itemprop="creator" itemscope itemtype="http://schema.org/Person"> 
    <h4 class="inline">Writers:</h4>
    <a href="/name/nm1318843/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"    itemprop="name">Mark Fergus</span></a>               (screenplay), 
    <a href="/name/nm1319757/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"         
    itemprop="name">Hawk Ostby</span></a>               (screenplay), <a href="fullcredits?ref_=tt_ov_wr#writers" >6 more credits</a>&nbsp;&raquo;
</div> 
4

2 に答える 2

6

なぜ反対票が多いのか?あなたは Regex で HTML を解析しないので、許可されませんか? それはとても視野が狭いです。

私は、htmlagilitypack がひどく不正な形式の HTML ドキュメントを適切に解析できない、または大量キャプチャからの連結またはネストされた HTML ドキュメントを解析できない時間の大部分を見てきました。または、HTML ドキュメントは動的に作成され、一貫性がなく、識別プロパティが含まれているとは限らないため、どの形式の XPath も機能しません。とにかく非常に単純な正規表現の方が信頼性が高いのに、なぜ余分なインクルードをインポートしてずさんなマークアップを回避するのでしょうか?

プロジェクト内の 1 つのメソッドが、入力 HTML ドキュメントの DIV の内容を引き出すだけでよい大規模なプロジェクトがある場合はどうでしょうか。これは HTML 解析プロジェクト全体ではありません。正規表現が 1 つだけ必要です。あなたの答えは、より多くのインポートを組み込み、そのためのまったく新しいフレームワークを構築することですか? 私は年間数百のプロジェクトを行っています。半分は DOM/XPath を使用し、残りの半分はそれができず、正規表現が必要です。

要するに、それほど視野が狭くならないでください。XPath/DOM ツールを参照しますが、質問への回答に役立ちます。反対票を投じないでください。私たちは、ずっと前に作成された古い「正規表現で HTML を解析しないでください」という投稿について一貫して笑う必要があるネアンデルタール人ではありません。

答えは次のとおりです。

まず、シンプレックスのもの:

(?s)<div.*?>(.*?)</div>

特定の名前の div が必要ですか?

(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>

CPU を節約し、不要なバックトラッキングを避けたいですか?

<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>

上記は、ネストされた DIV 項目がないことを前提としています。それが、正規表現を使用しないという全体的なアイデアが実際に作用するときです。C#.Net を使用している場合を除きます。その場合、これを行うだけです:

(?xm)
    (?>
        <(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)

または、単一行バージョン:

(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^\s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))

あなたの毒を選んでください。正規表現は、人々が考えているよりも強力で信頼性があります。私が投稿した最も複雑な例は、Regex Buddy では機能しませんが、どの .Net フレームワークでも機能します。Regex Buddy は、.Net フレーバーであるバランシング グループをサポートしていません。

于 2013-05-08T14:43:42.420 に答える