如何使用Goutte和Symfony DomCrawler从父div中过滤子节点值,其中style =“...”?

时间:2015-05-27 23:24:11

标签: php css symfony goutte domcrawler

我正在尝试使用包含Symfony组件的php包Goutte从给定的wikiquote页面中删除引号:BrowserKit,CssSelector和DomCrawler

但是在我的结果集中有一些我不想要的引号,来自misattributed section的引号。

这是我到目前为止所做的:

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'http://en.wikiquote.org/wiki/Thomas_Jefferson');

//grab all the children li's from the wikiquote page
$quotes = $crawler->filter('ul > li');

$quoteArray = [];

//foreach li with a node value that does not start with a number, push the node value onto quote array
//this filters out the table of contents <li> node values which I do not want

foreach($quotes as $quote)
{
    if(!is_numeric(substr($quote->nodeValue, 0, 1)))
    {
        array_push($quoteArray, $quote->nodeValue);
    }
}

此时我关注的问题是如何过滤出错误分配部分的引号。此部分包含在父div中,其中包含style属性:

style="padding: .5em; border: 1px solid black; background-color:#FFE7CC"

我在想,如果我能以某种方式从这个特定部分获取li节点值,我就可以从上面的$quoteArray中过滤掉它们。我遇到的问题是我无法弄清楚如何从此部分中选择子li节点值。

我尝试过选择具有以下变体的孩子:

$badQuotes = $crawler->filter('div[style="padding: .5em; border: 1px solid black; background-color:#FFE7CC"] > ul > li');

但这不会返回我需要的节点值。有谁知道怎么做或我做错了什么?

1 个答案:

答案 0 :(得分:0)

DomCrawler filter方法将

  

使用CSS选择器过滤节点列表。

比使用xpath强大。我猜CSS选择器无法将您的复杂查询转换为xpath表达式。因此,复杂的过滤器应该由filterXPath方法完成,而不是

  

使用XPath表达式过滤节点列表。

因此,在您的情况下,请尝试使用filterXPath方法:

$crawler->filterXPath("//div[contains(@style,'padding: .5em; border: 1px solid black; background-color:#FFE7CC')]");