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

The*_*tor 6 html php 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>
Run Code Online (Sandbox Code Playgroud)

这是我现在正在使用的.

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

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

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

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

谢谢

erm*_*nob 14

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

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

...并查看这些属性是否存在.它们似乎不是有效的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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Tec*_*ant 5

我知道这个问题很老,但是 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);
}
Run Code Online (Sandbox Code Playgroud)