使用PHP的HTML DOMDocument解析HTML

23

我本来试图使用 "getElementsByTagName",但它没有起作用。我是新手,尝试使用 DOMDocument 解析 HTML,以前我一直使用正则表达式,但昨天这里有些好心人告诉我 DOMEDocument 更适合这个任务,所以我正在尝试它 :)

我在谷歌上搜索了一段时间,寻找一些解释,但没有找到任何有帮助的东西(至少对于这个类没有)。

所以我想捕获 "Capture this text 1"、"Capture this text 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>
2个回答

56
如果您想获取:
- 在带有class="text"<div>标签内部的文本 - 这个<div>本身在带有class="main"<div>
我建议最简单的方法不是使用DOMDocument::getElementsByTagName(它会返回具有特定名称的所有标记,而您只想要其中的一些)。
相反,我会在您的文档上使用XPath查询,并使用DOMXpath类。
例如,以下内容可将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)

哦,怪不得谷歌找不到任何东西,我一直在搜索错误的东西。这正是我所需要的。我还想知道如何将测试HTML代码转换为字符串的好方法,但是看起来你已经读懂了我的心思并回答了我的问题,谢谢 :) - Mint
2
不客气 :-) 嗯,我使用 DOM 的次数越多,就越喜欢它 ;-) 玩得开心! - Pascal MARTIN
@PascalMARTIN 如果我说错了,请纠正我,但是 DOMDocument->loadHTML() 不是期望一个真正的 HTML 文档,包括 html,head,body 标签等吗? - Christian
2
@Christian 它可以加载格式不正确的HTML(并且可以处理部分HTML字符串,没有html/body/...标签) - Pascal MARTIN
@PascalMARTIN 对不起!知道这个非常有用。 - Christian

1

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

这是一个非常简单易用的基于PHP编写的DOM解析器,您可以轻松地获取div标签的内容。

就像这样:

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

请参阅其文档以获取更多帮助。

保留HTML

,不要解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接