0

まず第一に、私は同様の質問をたくさん見てきました。正規表現または dom を使用できることは知っていますが、DOM の良い例を見つけることができず、正規表現は私の髪を引っ張ります。さらに、HTML ソースから複数の値を引き出す必要があります。一部は単純なコンテンツで、一部は属性です。

情報を取得する必要がある html の例を次に示します。

<div class="log">
    <div class="message">
        <abbr class="dt" title="time string">
            DATA_1
        </abbr>
        :
        <cite class="user">
            <a class="tel" href="tel:+xxxx">
                <abbr class="fn" title="DATA_2">
                    Me
                </abbr>
            </a>
        </cite>
        :
        <q>
            DATA_3
        </q>
    </div>
</div>

「メッセージ」ブロックは、1 回または数百回発生する可能性があります。私はこのようなデータに終わろうとしています:

array(4) {
    [0] => array(3) {
               ["time"] => "DATA_1"
               ["name"] => "DATA_2"
               ["message"] => "DATA_3"
           }
    [1] => array(3) {
               ["time"] => "DATA_1"
               ["name"] => "DATA_2"
               ["message"] => "DATA_3"
           }
    [2] => array(3) {
               ["time"] => "DATA_1"
               ["name"] => "DATA_2"
               ["message"] => "DATA_3"
           }
    [3] => array(3) {
               ["time"] => "DATA_1"
               ["name"] => "DATA_2"
               ["message"] => "DATA_3"
           }
}

simplexml を使用してみましたが、非常に単純な html ページでしか機能しないようです。誰かが私をいくつかの例にリンクしてもらえますか? title 属性から DATA_2 を取得する必要があるため、非常に混乱します。彼のデータを抽出する最良の方法は何だと思いますか? 私が行った XML 抽出と非常に似ているようですが、他の方法を使用する必要があります。

4

2 に答える 2

2

DOMDocumentDOMXpathを使用して HTML を解析する例を次に示します。

$doc = new DOMDocument;
$doc->loadHTMLFile('your_file.html');
$xpath = new DOMXpath($doc);

$res = array();

foreach ($xpath->query('//div[@class="message"]') as $elem) {
    $res[] = array(
        'time' => $xpath->query('abbr[@class="dt"]', $elem)->item(0)->nodeValue,
        'name' => $xpath->query('cite/a/abbr[@class="fn"]', $elem)->item(0)->getAttribute('title'),
        'message' => $xpath->query('q', $elem)->item(0)->nodeValue,
    );
}
于 2012-07-04T05:28:24.903 に答える
0

xPath の使用を提案できますか? それはあなたがやりたいことの完璧な候補のようです (しかし、私はあなたが求めていることを誤解しているかもしれません)。

XPath を使用すると、XML/HTML ツリーの特定のノードを選択でき、そこからそれらを操作できます。その後は、単純なタスク (またはせいぜいほんの少しの単純な正規表現) である必要があります。個人的には正規表現が大好きなので、サポートが必要な場合はお知らせください)。

XPath ステートメントは次のようになります (競合する名前がないことを前提としています)。

時間 (データ 1):

/div/div/abbr/text()

名前 (データ 2):

/div/div/cite/a/abbr/@title

メッセージ (データ 3):

/div/div/q/text()

たとえば、属性を介して要素を識別したい場合は、これよりも多くの技術を取得できますが、私が提供したものはかなり高速です。

于 2012-07-04T05:58:13.963 に答える