首先,我已经看到了很多类似的问题。我知道正则表达式或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>
&#34;消息&#34;阻止可能发生一次或数百次。我想最终得到这样的数据:
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提取非常相似,但我需要使用其他方法。
答案 0 :(得分:2)
以下是使用DOMDocument和DOMXpath来解析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,
);
}
答案 1 :(得分:0)
我可以建议使用xPath吗?对于你想做的事情来说,这似乎是一个完美的候选人(但我可能会误解你的要求)。
XPath将允许您选择XML / HTML树的特定节点,然后您可以从那里对它们进行操作。在那之后,它应该是一个简单的任务(或者最多只是一点点简单的正则表达式。就个人而言,我喜欢正则表达式,所以如果你需要帮助,请告诉我。)
您的XPath语句看起来像(假设没有冲突的名称):
时间(数据1):
/div/div/abbr/text()
名称(数据2):
/div/div/cite/a/abbr/@title
消息(数据3):
/div/div/q/text()
例如,如果你想通过他们的属性来识别元素,那么你可以获得比这更多的技术,但是我给你的东西会非常快。