带有数据属性的 simple_html_dom 解析问题

Posted

技术标签:

【中文标题】带有数据属性的 simple_html_dom 解析问题【英文标题】:simple_html_dom parsing question with data attributes 【发布时间】:2020-04-08 13:27:22 【问题描述】:

我已经为这个问题苦苦挣扎了一段时间。我正在尝试解析具有许多 div 标签的 html 文档,在这些 div 标签内是其他 div 标签,它们具有我需要解析的一些数据属性。

但是,我确实需要保留 div class="row" 的原始循环。这不能改变。


    $test_html = '
        <div class="row">
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
        </div>
        <div class="row">
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
            <div class="item">
                <div class="op-item op-spread" data-op-info="someinfo1" data-op-source="somesource1" data-op-status="some status">some content 1</div>
                <div class="op-item spread-price" data-op-info="someinfo2">some content b</div>
                <div class="op-item op-spread" data-op-info="someinfo3" data-op-status="somemoney3" data-op-source="somesource3">some content 3</div>
                <div class="op-item spread-price" data-op-info="someinfo4">some content 4</div>
            </div>
        </div>

        '; 

    $html = new simple_html_dom();
    $html->load($test_html, true, false);

    foreach($html->find('div.row') as $a) 

        $item['book']['data'] = $a->find('div.item',0)->outertext;
        $item['book']['div1']['data-op-info'] = "someinfo1"; // desired output
        $item['book']['div2']['data-op-info'] = "someinfo2"; // desired output
        $item['book']['div3']['data-op-info'] = "someinfo3"; // desired output
        $item['book']['div4']['data-op-info'] = "someinfo4"; // desired output

        //$item['book']['div1'] = $a->find('div.item',1)->outertext;
        //$item['book']['div2'] = $a->find('div.item',2)->outertext;
        //$item['book']['div3'] = $a->find('div.item',3)->outertext;

    $data[] = $item;

    

    print_r($data);


我希望有人能够帮助我,我一直在努力解决这个问题。

【问题讨论】:

【参考方案1】:

您可以在item 节点上查询子节点,并使用函数getAttribute() 来获得所需的内容。

在这里,我假设节点总是以相同的顺序排列。也许您需要将选择器更改为更具体的内容:

$itemNode = $a->find('div.item',0) ;

$item['book']['data'] = $itemNode->outertext;
$item['book']['div1']['data-op-info'] = $itemNode->find('div.op-item',0)->getAttribute('data-op-info') ;
$item['book']['div2']['data-op-info'] = $itemNode->find('div.op-item',1)->getAttribute('data-op-info');
$item['book']['div3']['data-op-info'] = $itemNode->find('div.op-item',2)->getAttribute('data-op-info');
$item['book']['div4']['data-op-info'] = $itemNode->find('div.op-item',3)->getAttribute('data-op-info');

【讨论】:

以上是关于带有数据属性的 simple_html_dom 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 simple_html_dom 库从 <script> 标记解析 json 数据

php解析html类库simple_html_dom

php解析html类库simple_html_dom

php simple_html_dom.php 去掉html标签

php利用simple_html_dom类,获取页面内容,充当爬虫角色

Swift核心数据:设置可选属性值时为啥需要解包?