我有一个标记HTML如下:
<body>
<div>......</div>
............
<div class="entry-content">
<div class="code1 code2">(ads.....);</div>
<p><img src="https://www..."></img></p>
<h2> title </h2>
<div class="code1-block code2">(ads.....);</div>
<div class="data1 dta-ta1">
<ul><li><p> text</p></li>
<li><span> text2 </span></li>
<li><span> text3 </span></li>
<div class="codex1 code-block"><span>(ads ....); </span></div>
<li><span> text4 </span></li>
<div class="codex1 code-block"><span>(ads ....); </span></div>
</ul>
</div>
<div class="codex2-block code2">(ads.....);</div>
<div class="data2-entry dta-ta2">
<p>
<span> text5</span>
</p>
<p> text6 </p>
<p> text7 </p
<div class="codex1 code-block"><span>(ads ....); </span></div>
<li><span> text8 </span></li>
<div class="codex1 code-block"><span>(ads ....); </span></div>
</div>
</div>
</body>我尝试“使用class="entry-content"进入div,从它的子节点获取所有文本,不包括带有class= "code1", "code2", "codex1", "codex2"的子节点
下面的代码将转到div,并从子节点获取所有文本。但是,我不能从带有code1和code2的子节点中删除文本。感谢你的支持。谢谢。
$classname='entry-content';
$a = new DOMXPath($dom);
$query = "//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]";
$list = $a->query($query);
if ($list->length > 0) {
foreach ($list as $element) {
$nodes = $element->childNodes;
foreach ($element as $node) {
$bodytext = trim(preg_replace('/[\r\n]+/', ' ', $node->nodeValue));
$bodyContent .= '<p>' . $bodytext . '</p>';
}
}
}我的预期产出:
https://www...
标题
text2
text3
text4
text5
text6
text7
text8
发布于 2020-01-24 10:07:50
您的输入文档格式不正确,</p缺少一个div,并且没有正确关闭一个div。在固定输入文档后,工作路径表达式为
XPath表达式
//div[@class='content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()]它选择所有文本节点,但前提是它们没有一个具有值包含“代码”的div属性的祖先class元素,而且所选文本节点不能仅为空格。
输出
单独的结果由------分隔
title
-----------------------
text
-----------------------
text2
-----------------------
text3
-----------------------
text4
-----------------------
text5
-----------------------
text6
-----------------------
text7
-----------------------
text8 更新
,我试过了你的答案。它的工作,但我仍然需要一个来源从img标签。我怎么才能拿到呢?
也可以选择source元素的img属性,但这会使img表达式更加复杂。您应该添加另一行PHP来计算单独的路径表达式,例如:
//div[@class='entry-content']/p/img/@source更新2
虽然我绝对不建议使用这个表达式(因为它混淆了您的代码),但下面是如何将这两个表达式组合成一个带有联合运算符的表达式:
//div[@class='entry-content']//text()[not(ancestor::div/@class[contains(., 'code')])][normalize-space()] | //div[@class='entry-content']//p/img/@srchttps://stackoverflow.com/questions/59890059
复制相似问题