带有数据属性的 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 simple_html_dom.php 去掉html标签