【问题标题】:using xpath to extract data by introducing ancestor in xpath query使用 xpath 通过在 xpath 查询中引入祖先来提取数据
【发布时间】:2012-01-26 23:35:04
【问题描述】:

我正在使用以下代码

$doc = new DOMDocument();
$doc->strictErrorChecking = false;
@$doc->loadHTML($data);
  $xpath = new DOMXPath($doc);
 //Select the parent node
$categories =$xpath->query('//span[@class="refinementLink"]/ancestor::a/li/ul');
$abcd=array();
var_dump($categories);
foreach ($categories as $category) {


    $abcd[]=$category->nodeValue; 
      print_r('<br/>'.$abcd);
    // Crafts, Hobbies & Home (19)
}` //var_dump($abcd);

现在,这段代码做什么?它选择一个span标签,span标签的dom列表是

ul--li(4)--a(2)--span(3)

输出是

对象(DOMNodeList)[3]

看起来我做得很好,我的 html 文档中有 3 个 span 标签, 我需要的是,如何获取这些跨度标签的文本?我需要跨度标签之间的文本 有什么帮助吗?

【问题讨论】:

    标签: php regex arrays xpath domdocument


    【解决方案1】:

    -&gt;textContent

    foreach ($categories as $category) {
        $abcd[]=$category->textContent; 
    }
    var_dump($abcd);
    

    【讨论】:

    • 抱歉无法理解,看来,我在解决这个问题时必须记住整个列表
    • 这就是你想要的属性...我有点懒,我会补充一点;)不需要记住列表(我也不需要),但是通读所有如果你想要一个属性,你手头的对象的文档可以很好地与优秀的 php-documentation 配合使用。
    • $abcd[]=$category->nodeValue->textcontent;和 $abcd[]=$category->textcontent;我尝试了这些替换,但仍然是相同的输出
    • 顺便说一句:object(DOMNodeList)[3] 并不意味着其中有 3 个元素 afaik,var_dump($categories-&gt;length); 说什么?
    • 顺便说一句:查看$doc-&gt;saveHTML() 的输出以确切了解加载的 DOMDocument,有时它与实际输入不同...
    【解决方案2】:

    我认为您可能可以在执行 XPath 查询时一开始就提取 @attribute。 XPath 中的谓词为您处理 foreach。

    我使用来自 Oxygen IDE 的 XML 开发人员,它可以很好地显示 XPath 从 XML 中解析出的内容,因此您可以更确定会发生什么。

    //span/@text[../@class="refinementLink"]/ancestor::a/li/ul 我不确定 text 是否是您的目标文本的属性,但在 XPath 中,[] 之前的任何内容都与您要选择的内容有关。你选择它作为一个节点,所以你必须在那里做额外的工作。如果你拉出一个字符串序列,你可能会得到别的东西。我自己从未尝试过,只是提供了另一种想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多