使用PHP的HTML DOMDocument解析HTML

Min*_*int 22 html php parsing domdocument

我试图用"getElementsByTagName"来做它,但是它不起作用,我是新手使用DOMDocument来解析HTML,因为我曾经使用正则表达式直到昨天在这里有一些类型的fokes告诉我DOMEDocument会更好用于工作,所以我试一试:)

我谷歌周围寻找一些解释,但没有找到任何帮助(不管怎么样)

所以我想捕获"捕获此文本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>
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 52

如果你想得到:

  • 文本
  • 那是在一个<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);
Run Code Online (Sandbox Code Playgroud)


然后,您可以使用该DOMXPath::query方法使用XPath查询返回您要搜索的元素列表:

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


执行此操作会给我以下输出:

string 'Capture this text 1' (length=19)
string 'Capture this text 2' (length=19)
Run Code Online (Sandbox Code Playgroud)

  • 你很受欢迎:-)嗯,我越用DOM,我就越喜欢它;-)玩得开心! (2认同)
  • @Christian它可以加载格式不正确的HTML*(并且可以处理部分HTML字符串,没有html/body/...标签)* (2认同)