【问题标题】:Simple HTML DOM getting all attributes from a tag简单的 HTML DOM 从标签中获取所有属性
【发布时间】:2013-01-05 13:39:35
【问题描述】:

一个两部分的问题,但也许一个回答另一个。我试图从一个

<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 和内部文本。我尝试将 $a->data1 添加到 foreach ,但没有奏效。

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

还有一种好方法可以用一个语句来获得两个类吗?我假设我可以根据 id 建立查找并获取所有 div 信息。

谢谢

【问题讨论】:

    标签: php html dom


    【解决方案1】:
    $data1 = $html->find('.bar > a', 0)->attr['data1'];
    $data2 = $html->find('.bar > a', 0)->attr['data2'];
    

    【讨论】:

    • 请在您的代码中添加一些解释,以便其他人可以从中学习
    【解决方案2】:

    检查此代码

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

    【讨论】:

    • 只有代码的答案质量不高。请编辑您的答案以解释您的代码。展示它如何以及为什么回答这个问题。添加指向任何相关文档的链接。
    • 万岁! 'attr' 向我返回了一个 PHP 致命错误。有了“getAttribute”,我就可以正常工作了。
    【解决方案3】:

    我知道这个问题很老,但 OP 询问他们如何在一个语句中获得所有属性。我只是为我正在做的一个项目做这个。

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

    在下面的示例中,我抓取了所有链接,但您可以随心所欲地使用它。注意:这也适用于data- 属性。因此,如果有一个名为 data-url 的属性,在您运行 getAllAttributes 方法后,将可以使用 $e-&gt;attr['data-url'] 访问它。

    在您的情况下,您要查找的属性将是 $e-&gt;attr['data1']$e-&gt;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);
    }
    

    【讨论】:

      【解决方案4】:

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

      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){
      ...
      

      【讨论】:

      • 补充:如果两个类真的都以相同的前缀开头(在你的例子中是“bar”),这可能对你也有用:div[class^=bar](意思是:类以“bar”开头)
      • 非常感谢。不过不要太密集..我该如何分配。我的意思是,一旦我找到获得多个 div 的结果,我该怎么办?我仍然将“作为$a”分配吗?抱歉这里太密集了。
      • 谢谢ermanbob。多重选择器效果很好。我似乎仍然无法提取该自定义 属性,它实际上是 data-content-id。我查看了stackoverflow.com/questions/11830933/…,但我不确定如何处理最后一个示例来实际显示属性。我也在查看stackoverflow.com/questions/11773940/…,但使用它会返回错误。对于这两个我都用我的 $html=file_get_html('foo.bar');行。
      • 您提供的第一个链接非常有用。我再次编辑了我的答案,向您展示如何阅读这些属性。
      • Ermannob 非常感谢!我没有意识到我可以使用 $a->attr!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多