我使用DOMXPath获取特定节点的内容。对于我的问题,除了嵌套div之外,我想获得匹配div的所有文本。
$html =
'<div itemscope="itemscope" itemtype="http://schema.org/Event">
<span itemprop="name"> Miami Heat at Philadelphia 76ers - Game 3 (Home Game 1)</span>
<meta itemprop="startDate" content="2016-04-21">
Thu, 04/21/16
8:00 p.m
<div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/AggregateOffer">
Priced from: <span itemprop="lowPrice">$35</span>
<span itemprop="offerCount">1938</span> tickets left
</div>
<meta itemprop="endDate" content="2020-3-2"> end date of year
<div itemprop="attendee" itemscope="itemscope" itemtype="http://schema.org/Person">
<span itemprop="name">Jane Doe</span>
<meta itemprop="birthDate" content="1975-05-06">
<div itemprop="sibling" itemscope="itemscope" itemtype="http://schema.org/Person">
<span itemprop="name">Fatima Zohra</span>
<meta itemprop="birthDate" content="1991-6-5">Jan 6
</div>
</div>
</div>';我首先尝试了以下操作,但这并没有返回嵌套的div:
$tags = $xpath->query("//div[@itemscope='itemscope'][not(self::div)]/text()");我目前的尝试如下,但不起作用:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[not(ancestor::div)]');
foreach ($tags as $node) {
echo $node->nodeValue; // body
}发布于 2013-03-18 11:37:54
这个问题最好分为两部分:
以下说明了这一做法:
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$divs = $xpath->query("//div[@itemscope='itemscope']");
foreach ($divs as $div) {
$nodelist = $xpath->query('child::node()[not(self::div)][normalize-space()]',$div);
foreach ($nodelist as $node) {
echo $node->nodeValue . "\n";
}
echo "\n---------------------\n";
}请注意以下事项:
顺便说一下,“not (祖先::div)”专门说不要返回嵌套在其他div中的div。
发布于 2013-03-20 01:50:42
您要查找的http://schema.org/docs/gs.html具有itemprop、itemscope、itemtype和content属性。
所以你的问题实际上是关于如何从那个HMTL文档中获取微观数据。这基本上是一个XML解析的问题。由于schema.org微数据(或多或少是直接的),我强烈建议使用DOMDocument来加载HMTL文档,而使用SimpleXML来解析数据。
基于libxml的PHP扩展中的解析不能单独使用xpath,因为库只支持XPath1.0,而且您不能使用那个xpath版本完成所有工作。特别是在这种情况下,只选择具有特定属性的子代或自我,该属性相对于不包含具有该特定属性的子节点的context节点。因此,这总是需要一些包装代码。如果您有兴趣阅读更多这方面的内容,我会发现以下问题与您的xpath问题类似:
因此,相反,将xpath代码包装在某个类中,然后立即访问感兴趣的数据:
$dom = new DOMDocument;
$dom->loadHTML($html);
$micro = new Micro($dom);
$event = $micro->Event;
foreach($event as $name => $value) {
if ($value->isEmbed()) continue;
printf("%s => %s\n", $name, $value);
}给出以下输出:
name => Miami Heat at Philadelphia 76ers - Game 3 (Home Game 1)
startDate => 2016-04-21
endDate => 2020-3-2或者你直接进入:
$micro->Event->name; # Miami Heat at Philadelphia 76ers - Game 3 (Home Game 1)https://stackoverflow.com/questions/15469589
复制相似问题