【问题标题】:How to parse a p tag content with no class and no id using SimpleHTMLdom parser?如何使用 SimpleHTMLdom 解析器解析没有类和没有 id 的 p 标签内容?
【发布时间】:2016-07-18 03:03:18
【问题描述】:

这是我要解析的 html 部分,以便获取 <p> 中的文本:

<div class="container">
    <h2>title</h2>
    <div class="divIdontNeed"> hi </div>
    <p> I WANT THIS TEXT </p> <====== this is what i want
    <p> i don't want this one </p>
</div>

我所做的是一个循环(因为上面的 html 在多个页面上,我希望它们都在一个数组 $allTexts 上):

foreach($html->find('div[class=container]')->find('p',0) as $text){

                    array_push($allTexts, $text->plaintext);
                }

当我这样做时,我收到一条错误消息Fatal error: Call to a member function find() on array in /path/to/MyTextParser.php

谢谢大家

【问题讨论】:

  • 您是否有多个具有“容器”类的 div?
  • 我所说的“多个”是指:我正在解析的网站包含分页,所有页面都包含相同的 html 部分(内容不同但结构相同)

标签: dom html-parsing simple-html-dom


【解决方案1】:

您收到错误是因为第一个 find() 返回一个元素数组,而不仅仅是一个。

你需要对第一个find()的结果进行循环:

foreach($html->find('div[class=container]') as $element)
{
   foreach ($element->find('p',0) as $text){
   array_push($allTexts, $text->plaintext);
  }
 }

【讨论】:

  • 不要自命不凡,只需在第三行添加'foreach'我的朋友;)谢谢
【解决方案2】:

你应该选择你想要的第 n 个元素。

$divObj=$html->find('div.container', 0);

echo $divObj->find('p', 0)->plaintext; //you are choosing only first p tag

echo $divObj->find('p', 1)->plaintext; //you are choosing only second p tag

如果你需要来自 div 的所有 p 元素的文本,你需要做 foreach

你可以选择它作为 div 的下一个兄弟姐妹 divIdontNeed

$divObj=$html->find('div.divIdontNeed', 0)->next_sibling();

echo $divObj->plaintext;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2020-12-06
    • 2020-08-26
    • 2022-01-13
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多