PHP 简单 Html Dom 从一个标签中提取多个标签 class
PHP Simple Html Dom extract multiple tags from one class
我是一个使用简单 html dom 和 php 的新手,我正在努力从一个 class 中提取多个 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
- href link
- 标签中的纯文本
- 3 个跨度的元素文本中的每一个
我在 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
}
}
谁能帮帮我。
您需要构建将 HTML 分开的各个层,您首先要找到 <div>
标签。您可以从中找到 <div>
中的 <a>
标记,然后获取 href 属性(使用 ->href
)。这段代码假设只有一个 <a>
标签,所以我只是说使用第一个标签(使用 [0]
)而不是 foreach
。
<span>
标签也是类似的过程,但是由于有重复的元素,所以这次使用了foreach
。此代码输出 class 属性和范围的内容。
$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
我是一个使用简单 html dom 和 php 的新手,我正在努力从一个 class 中提取多个 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
- href link
- 标签中的纯文本
- 3 个跨度的元素文本中的每一个
我在 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
}
}
谁能帮帮我。
您需要构建将 HTML 分开的各个层,您首先要找到 <div>
标签。您可以从中找到 <div>
中的 <a>
标记,然后获取 href 属性(使用 ->href
)。这段代码假设只有一个 <a>
标签,所以我只是说使用第一个标签(使用 [0]
)而不是 foreach
。
<span>
标签也是类似的过程,但是由于有重复的元素,所以这次使用了foreach
。此代码输出 class 属性和范围的内容。
$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