首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOMXPATH->不获取div的第一个元素

DOMXPATH->不获取div的第一个元素
EN

Stack Overflow用户
提问于 2013-03-18 04:06:06
回答 2查看 920关注 0票数 0

我使用DOMXPath获取特定节点的内容。对于我的问题,除了嵌套div之外,我想获得匹配div的所有文本。

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$tags = $xpath->query("//div[@itemscope='itemscope'][not(self::div)]/text()");

我目前的尝试如下,但不起作用:

代码语言:javascript
复制
$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

}
EN

回答 2

Stack Overflow用户

发布于 2013-03-18 11:37:54

这个问题最好分为两部分:

  1. 返回匹配的div列表。
  2. 打印每个div的所有内容,但包含div的内容除外。

以下说明了这一做法:

代码语言:javascript
复制
$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";
}

请注意以下事项:

  • ‘'child::node()’而不是'*‘包括文本节点
  • ‘()删除多余的空格,包括换行符

顺便说一下,“not (祖先::div)”专门说不要返回嵌套在其他div中的div。

票数 1
EN

Stack Overflow用户

发布于 2013-03-20 01:50:42

您要查找的http://schema.org/docs/gs.html具有itempropitemscopeitemtypecontent属性。

所以你的问题实际上是关于如何从那个HMTL文档中获取微观数据。这基本上是一个XML解析的问题。由于schema.org微数据(或多或少是直接的),我强烈建议使用DOMDocument来加载HMTL文档,而使用SimpleXML来解析数据。

基于libxml的PHP扩展中的解析不能单独使用xpath,因为库只支持XPath1.0,而且您不能使用那个xpath版本完成所有工作。特别是在这种情况下,只选择具有特定属性的子代或自我,该属性相对于不包含具有该特定属性的子节点的context节点。因此,这总是需要一些包装代码。如果您有兴趣阅读更多这方面的内容,我会发现以下问题与您的xpath问题类似:

因此,相反,将xpath代码包装在某个类中,然后立即访问感兴趣的数据:

代码语言:javascript
复制
$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);
}

给出以下输出:

代码语言:javascript
复制
name =>  Miami Heat at Philadelphia 76ers - Game 3 (Home Game 1)
startDate => 2016-04-21
endDate => 2020-3-2

或者你直接进入:

代码语言:javascript
复制
$micro->Event->name; # Miami Heat at Philadelphia 76ers - Game 3 (Home Game 1)

Microdata class as gist

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15469589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档