简单的HTML DOM从标记中获取所有属性

时间:2013-01-22 10:39:41

标签: php html dom

两部分问题的排序,但也许一个回答另一个问题。我正试图从中得到一条信息

<div id="foo">
<div class="bar"><a data1="xxxx" data2="xxxx" href="http://foo.bar">Inner text"</a>
<div class="bar2"><a data3="xxxx" data4="xxxx" href="http://foo.bar">more text"</a>

这是我现在正在使用的内容。

$articles = array();
$html=file_get_html('http://foo.bar');
foreach($html->find('div[class=bar] a') as $a){
    $articles[] = array($a->href,$a->innertext);
}

这非常适合从第一个div类中获取href和内部文本。我尝试在foreach中添加$ a-&gt; data1,但这不起作用。

如何在抓取href和innertext的同时抓取那些内部数据标签。

还有一种方法可以让两个类都有一个语句吗?我假设我可以构建id的查找并获取所有div信息。

由于

4 个答案:

答案 0 :(得分:12)

要获取所有这些属性,您应该先调查已解析的元素,如下所示:

foreach($html->find('div[class=bar] a') as $a){
  var_dump($a->attr);
}

...并查看这些属性是否存在。它们似乎不是有效的HTML,因此解析器可能会丢弃它们。

如果存在,您可以这样阅读:

foreach($html->find('div[class=bar] a') as $a){
  $article = array($a->href, $a->innertext);
  if (isset($a->attr['data1'])) {
    $article['data1'] = $a->attr['data1'];
  }
  if (isset($a->attr['data2'])) {
    $article['data2'] = $a->attr['data2'];
  }
  //...
  $articles[] = $article;
}

要获得这两个类,您可以使用多个选择器,用逗号分隔:

foreach($html->find('div[class=bar] a, div[class=bar2] a') as $a){
...

答案 1 :(得分:2)

我知道这个问题已经过时了,但是OP问他们如何在一个声明中获得所有属性。我刚刚为我正在进行的项目做了这个。

您可以使用getAllAttributes()方法获取元素的所有属性。结果将自动存储在名为attr的数组属性中。

在下面的示例中,我抓住了所有链接,但您可以随意使用它。注意:这也适用于data-属性。因此,如果存在名为data-url的属性,则在运行$e->attr['data-url']方法后,getAllAttributes可以访问该属性。

在您的情况下,您要查找的属性为$e->attr['data1']$e->attr['data2']。希望这有助于某人,如果不是OP。

获取所有属性

$html = file_get_html('somefile.html');
foreach ($html->find('a') as $e) {   //used a tag here, but use whatever you want
    $e->getAllAttributes();

    //testing that it worked
    print_r($e->attr);
}

答案 2 :(得分:0)

检查此代码

<?php
$html = file_get_html('somefile.html');
foreach ($html->find('a') as $e) { 
$filter = $e->getAttribute('data-filter-string');
}
?>

答案 3 :(得分:0)

$data1 = $html->find('.bar > a', 0)->attr['data1'];
$data2 = $html->find('.bar > a', 0)->attr['data2'];