3

这是我需要解析为 PHP 程序的 HTML 示例:

                    <div id="dump-list">    
<div class="dump-row"> 
 <div class="dump-location odd" data-jmapping="{id: 35, point: {lng: -73.00898601, lat: 41.71727402}, category: 'office'}">

    <div class="SingleLinkNoTx">
    <a href="#10" class="loc-link">Acme Software</a><br/><strong>John Doe, MBA</strong><br/>123 Main St.<br />New York, NY 10036<br /><strong class="telephone">(212) 555-1234</strong><br/>
    </div><!-- END.SingleLinkNoTx -->

    <a href="http://www.example.com" target="_blank" class="web_link">Visit Website</a><span><br />(0.3 miles)</span>   
    <div class="loc-info">
            <div class="loc-info-text ">
        John Doe, MBA<br /><a href="http://maps.google.com/?daddr=41.71727402,-73.00898601" target="_blank">Get Directions &raquo;</a>    
        </div>

    </div>

</div>

这是我想从上面的 HTML 示例中提取到 PHP 中的信息:

lng: -73.00898601, lat: 41.71727402
category: 'office'
Acme Software
John Doe, MBA
123 Main St.
New York, NY 10036
(212) 555-1234
http://www.example.com

我曾尝试使用 PHP Simple HTML DOM Parser,但我是新手,找不到与我需要做的事情相关的有效 PHP 示例。我尝试了一些这样的 PHP 代码来理解它是如何工作的,但是 var_dump($e) 会产生大量的输出,并且在 var_dump 中有关于递归的消息。所以我迷失了如何真正使用它。非常感谢一些帮助!

$e = $html->find('.dump-location', 0)->find('.SingleLinkNoTx', 0);
echo $e;
var_dump($e);
4

1 回答 1

4

使用 XPath 在 HTML/XML 文档中查找和提取元素 - 特别是SimpleXMLElement::xpath方法。

以下示例将查找某个位置的电话号码:

$doc = new DOMDocument();
$doc->loadHTML('your html snippet goes here - or use loadHTMLFile()');
$xml = simplexml_import_dom($doc);
$elements = $xml->xpath('//*[contains(@class, "dump-location")]/div[@class="SingleLinkNoTx"]/strong[@class="telephone"]');
print_r($elements);

最复杂的部分是 XPath 表达式。快速细分:

  1. //
    • 该规则告诉解析器递归地将规则应用于文档中的所有元素。
  2. *[contains(@class, "dump-location")]
    • 匹配任何具有dump-location该类的元素
  3. /
    • 告诉解析器仅将下一个规则应用于具有dump-location父元素的元素。
  4. div[@class="SingleLinkNoTx"]
    • 匹配任何DIV具有SingleLinkNoTx类(且没有其他类名)的元素。
  5. strong
    • STRONG将所有标签与一个telephone类匹配的规则。

在问题中提供的 HTML 片段上使用此 XPath 表达式将产生如下输出。从以下位置迭代和提取信息相当容易:

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [class] => telephone
                )

            [0] => (212) 555-1234
        )

)

如果您知道文档结构,则可以为要提取的每条信息构造一个 XPath 表达式。或者,使用更通用的 XPath 表达式(例如,检索所有dump-location元素的表达式)并手动迭代元素可能更简单。

于 2012-09-09T21:20:36.230 回答