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>

“消息”块可能出现一次或数百次。我试图最终得到这样的数据:

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 页面。有人可以将我链接到一些例子吗?我真的很困惑,因为我需要从标题属性中获取 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 回答