按类名获取 DOM 元素

2022-08-30 06:58:32

我正在使用PHP DOM,并且我正在尝试在DOM节点中获取具有给定类名的元素。获取该子元素的最佳方法是什么?

更新:我最终使用了PHP,这更容易使用。Mechanize


答案 1

更新: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 ')]");

基本上,我们在这里所做的就是规范化属性,以便即使单个类也由空格限定,并且完整的类列表以空格为单位。然后用空格附加我们要搜索的类。这样,我们就可以有效地查找并仅查找 的实例。classmy-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\"]");

答案 2

如果你想在没有 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;

推荐