【问题标题】:Extract info from html?从html中提取信息?
【发布时间】:2012-07-04 13:49:45
【问题描述】:

首先,我见过很多类似的问题。我知道可以使用正则表达式或 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提取很相似,但是我需要使用一些其他的方法。

【问题讨论】:

  • 你提取的网址是什么?
  • 你看过 DOM 函数吗? php.net/manual/en/book.dom.php
  • 另一个提取数据的好库是 phpQuery,因为它的运行方式与您已经用来抓取网页的 jQuery 类似。

标签: php html xml parsing dom


【解决方案1】:

这是一个使用 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,
    );
}

【讨论】:

  • 哇...令人印象深刻。虽然有一个小问题,但它停留在元素 0 上,我不知道为什么。我也不知道 DOM 是如何工作的。我试图通过 simplehtmldom 的文档从头开始做一些事情,但你只是为我节省了很多时间!
  • $xpath-&gt;query() 总是返回元素列表,所以我们通常在一个循环中获取元素,或者只是 item(0)item(1)item(2) 等。因为我们知道只有一个&lt;abbr class="dt"&gt;...&lt;/abbr&gt;,我们可以用item(0)获取它。
  • 太棒了,它几乎可以工作了...非常感谢您的帮助。我的服务器不知何故存在“getAttribute”问题,说的是“非对象”。我不是一个非常自律的程序员,所以我不知道为什么它不是对象......
  • 没关系,这部分是我的错。代码中的名称字段存在不一致之处,我稍后将对其进行试验。它有效:)
【解决方案2】:

我可以建议使用 xPath 吗?它似乎是您想做的事情的完美候选人(但我可能误解了您的要求)。

XPath 将允许您选择 XML/HTML 树的特定节点,然后您可以从那里对它们进行操作。在那之后,它应该是一个简单的任务(或者最多是一点点简单的正则表达式。就我个人而言,我喜欢正则表达式,所以如果你需要帮助,请告诉我)。

您的 XPath 语句将类似于(假设没有冲突的名称):

时间(数据1):

/div/div/abbr/text()

名称(数据 2):

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

消息(数据 3):

/div/div/q/text()

如果你想通过属性识别元素,你可以获得比这更多的技术,但我给你的会很快。

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 2015-02-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多