按类名获取 DOM 元素
我正在使用PHP DOM,并且我正在尝试在DOM节点中获取具有给定类名的元素。获取该子元素的最佳方法是什么?
更新:我最终使用了PHP,这更容易使用。Mechanize
我正在使用PHP DOM,并且我正在尝试在DOM节点中获取具有给定类名的元素。获取该子元素的最佳方法是什么?
更新:我最终使用了PHP,这更容易使用。Mechanize
更新:Xpath 版本的 *[@class~='my-class']
css 选择器
因此,在我在下面的评论回应了hakre的评论之后,我感到好奇并研究了背后的代码。看起来上面的选择器被编译为以下 xpath(未经测试):Zend_Dom_Query
[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
所以PHP将是:
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
基本上,我们在这里所做的就是规范化属性,以便即使单个类也由空格限定,并且完整的类列表以空格为单位。然后用空格附加我们要搜索的类。这样,我们就可以有效地查找并仅查找 的实例。class
my-class
使用 xpath 选择器?
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(@class, '$classname')]");
如果它只是一种类型的元素,则可以将 替换为特定的标记名称。*
如果你需要用非常复杂的选择器做很多事情,我会推荐Zend_Dom_Query
它支持CSS选择器语法(la jQuery):
$finder = new Zend_Dom_Query($html);
$classname = 'my-class';
$nodes = $finder->query("*[class~=\"$classname\"]");
如果你想在没有 zend 的情况下获得该类的 innerhtml,你可以使用这个:
$dom = new DomDocument();
$dom->load($filePath);
$classname = 'main-article';
$finder = new DomXPath($dom);
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
$tmp_dom = new DOMDocument();
foreach ($nodes as $node)
{
$tmp_dom->appendChild($tmp_dom->importNode($node,true));
}
$innerHTML.=trim($tmp_dom->saveHTML());
echo $innerHTML;