使用PHP的HTML DOMDocument解析HTML

时间:2010-04-03 12:23:59

标签: php html parsing domdocument

我试图用“getElementsByTagName”来做,但是它不起作用,我是新手使用DOMDocument解析HTML,因为我曾经使用正则表达式,直到昨天在这里有一些类型的fokes告诉我DOMEDocument将是对工作更好,所以我试一试:)

我谷歌一段时间寻找一些解释,但没有发现任何有帮助(不管怎么样)

所以我想捕获“捕获此文本1”和“捕获此文本2”等等。

看起来并不难,但我无法弄明白:(

<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>

2 个答案:

答案 0 :(得分:51)

如果你想获得:

  • 文字
  • 位于带有<div>
  • class="text"标记内
  • 就在<div> class="main"

我想说最简单的方法就是不使用DOMDocument::getElementsByTagName - 它会返回所有具有特定名称​​的标签(而您只想要其中一些)

相反,我会使用DOMXpath类在您的文档上使用XPath查询。


例如,像这样的事情应该做,将HTML字符串加载到DOM对象,并实例DOMXpath类:

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


然后,您可以使用带有DOMXPath::query方法的XPath查询返回您要搜索的元素列表:

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($tag->nodeValue));
}


执行此操作会给我以下输出:

string 'Capture this text 1' (length=19)
string 'Capture this text 2' (length=19)

答案 1 :(得分:1)

您可以使用http://simplehtmldom.sourceforge.net/

使用php编写的DOM解析器非常简单易用,您可以通过它轻松获取div标签的内容。

这样的事情:

// Find all <div> which have attribute id=text
$ret = $html->find('div[id=text]'); 

请参阅其文档以获取更多帮助。