我是一个使用简单的html dom与php的新手,我正在努力从一个类中提取多个html标签。我在一个页面中有多个这样的html块
<div class="file-right">
<a href="/secrets-of-the-millionaire-mind-tomocubcom-e17682584.html" class="ai-similar" data-id="17682584" data-loc="3">
<h2><b>Secrets</b> of the <b>Millionaire</b> <b>Mind</b> - TOMOCUB.COM</h2>
</a>
<span class="fi-pagecount">223 Pages</span>
<span class="fi-year">2005</span>
<span class="fi-size hidemobile">1015 KB</span>
</div>
2 - <b>Secrets</b> of the <b>Millionaire</b> <b>Mind</b> and your achievement of <b>success</b>. As you’ve probably fo ...
</div>
并从每个块我要提取的这个HTML
我一直在用php做这件事,但一次又一次地出错。这是我现在最后的代码
$html = @str_get_html($response);
$allblocks=$html->find('div.file-right'); //this selects all file-right blocks
if(isset($allblocks)){
foreach($allblocks as $singleblock){
echo $singleblock->plaintext; // but i get an error here PHP Notice: Array to string conversion
}
}
任何人都可以帮助我。
答案 0 :(得分:1)
您需要建立各个层次的HTML,您首先找到<div>
标记。您可以在此<a>
中找到<div>
标记,然后获取href属性(使用->href
)。此代码假定只有一个<a>
标记,而不是foreach
我只是说使用第一个(使用[0]
)。
<span>
代码是一个类似的过程,但由于有重复的元素,这次它使用foreach
。此代码输出class属性和span的内容。
$html = str_get_html($response);
$allblocks=$html->find('div.file-right'); //this selects all file-right blocks
if ( count($allblocks) > 0 ){
foreach ( $allblocks as $block ) {
$anchor = $block->find("a");
echo "href=".$anchor[0]->href.PHP_EOL;
echo "text=".$anchor[0]->plaintext.PHP_EOL;
$spans = $block->find("span");
foreach ( $spans as $span ) {
echo "span=".$span->class."=".$span->plaintext.PHP_EOL;
}
}
}
请注意,在原始代码中,您使用isset($allblocks)
作为设置值之前的行 - 即使它没有找到任何内容,它仍然会有值。在此代码中,我使用count()
检查上次调用find()
是否返回任何内容。
使用示例HTML,仅包含在最小页面中,输出为...
href=/secrets-of-the-millionaire-mind-tomocubcom-e17682584.html
text= Secrets of the Millionaire Mind - TOMOCUB.COM
span=fi-pagecount=223 Pages
span=fi-year=2005
span=fi-size hidemobile=1015 KB