Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 简单的HTMLDOM从标记中获取所有属性_Php_Html_Dom - Fatal编程技术网

Php 简单的HTMLDOM从标记中获取所有属性

Php 简单的HTMLDOM从标记中获取所有属性,php,html,dom,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"&g

这是一个由两部分组成的问题,但也许其中一部分可以回答另一部分。我正试着从一份报告中得到一点信息
<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>
这非常适合从第一个div类获取href和内部文本。我尝试向foreach添加$a->data1,但没有成功

如何在获取href和innertext的同时获取这些内部数据标记

还有没有一种好方法可以用一条语句同时获得两个类?我想我可以建立id的查找并获取所有div信息


感谢

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

foreach($html->find('div[class=bar] a') as $a){
  var_dump($a->attr);
}
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;
}
…并查看这些属性是否存在。它们似乎不是有效的HTML,因此解析器可能会丢弃它们

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

foreach($html->find('div[class=bar] a') as $a){
  var_dump($a->attr);
}
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){
...

我知道这个问题由来已久,但OP问他们如何在一个语句中获得所有属性。我只是为了我正在做的一个项目才这么做的

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

在下面的例子中,我抓取了所有的链接,但是你可以用任何你想要的。注意:这也适用于
数据-
属性。因此,如果有一个名为
dataurl
的属性,那么在运行
getAllAttributes
方法后,可以使用
$e->attr['data-url']
访问该属性

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

获取所有属性

检查此代码

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


Addition:如果两个类都以相同的前缀开头(在您的示例中为“bar”),这可能也适用于您:
div[class^=bar]
(意思是:类以“bar”开头),非常感谢。不要太过密集,我该怎么分配呢。我的意思是,一旦我找到多个div,我该怎么做?我是否仍将其指定为“a美元”?对不起,这里太闷了,谢谢你。多重选择器工作得很好。我似乎仍然无法实现自定义,但我不确定如何使用最后一个示例来实际显示属性。我也在看,但使用它会返回一个错误。对于这两者,我都用$html=file_get_html(');行。您提供的第一个链接非常有用。我再次编辑了我的答案,向你们展示了如何阅读这些属性。Ermannob非常感谢你们!我没有意识到我可以使用$a->attr!只有代码的答案质量不高。请编辑您的答案以解释您的代码。展示它如何以及为什么回答这个问题。添加任何相关文档的链接。万岁!“attr”向我返回了一个PHP致命错误。使用“getAttribute”我可以让它工作。请在代码中添加一些解释,以便其他人可以从中学习
$data1 = $html->find('.bar > a', 0)->attr['data1'];
$data2 = $html->find('.bar > a', 0)->attr['data2'];