使用PHP的HTML DOMDocument解析HTML

2022-08-30 18:55:57

我试图用“getElementsByTagName”来做这件事,但它不起作用,我是使用DOMDocument解析HTML的新手,因为我曾经使用正则表达式,直到昨天这里的一些fokes告诉我DOMDocument会更适合这项工作,所以我尝试了一下:)

我在谷歌上搜索了一段时间,寻找一些解释,但没有找到任何有帮助的东西(反正不是上课)

因此,我想捕获“捕获此文本 1”和“捕获此文本 2”等。

看起来并不难,但我无法弄清楚:(

<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>

答案 1

如果你想得到 :

  • 文本
  • 在标签内<div>class="text"
  • 这本身就是一个<div>class="main"

我想说最简单的方法是不使用DOMDocument::getElementsByTagName - 这将返回所有具有特定名称的标签(而您只需要其中一些标签)。

相反,我会使用 DOMXpath 类对文档使用 XPath 查询。


例如,像这样的事情应该这样做,将HTML字符串加载到DOM对象中,并实例化类:DOMXpath

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


然后,您可以将 XPath 查询与 DOMXPath::query 方法一起使用,该方法返回您正在搜索的元素列表:

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($tag->nodeValue));
}


执行这个会给我以下输出:

string 'Capture this text 1' (length=19)
string 'Capture this text 2' (length=19)

答案 2

您可以使用 http://simplehtmldom.sourceforge.net/

用php编写的DOM解析器非常简单易用,通过它可以轻松获取div标签的内容。

像这样:

// Find all <div> which have attribute id=text
$ret = $html->find('div[id=text]'); 

有关更多帮助,请参阅其文档。


推荐