Как отфильтровать значения дочерних узлов из родительского div, где стиль = с помощью Goutte и Symfony DomCrawler?

Я пытаюсь очистить цитаты с данной страницы викицитата, используя пакет php Goutte, который обертывает компоненты Symfony. : BrowserKit, CssSelector и DomCrawler.

Однако есть определенные цитаты, которые мне не нужны в моем наборе результатов, цитаты из раздела с неверным атрибутом.

Вот что у меня есть до сих пор:

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');

Но это не возвращает значения узлов, которые мне нужны. Кто-нибудь знает, как это сделать или что я делаю неправильно?


person Fetus    schedule 27.05.2015    source источник


Ответы (1)


Метод filter DomCrawler будет

Фильтрует список узлов с помощью селектора CSS.

что менее мощно, чем использование xpath. Я предполагаю, что селектор CSS не смог преобразовать ваш сложный запрос в выражения xpath. Таким образом, сложный фильтр должен быть выполнен методом filterXPath. вместо этого будет

Фильтрует список узлов с выражением XPath.

Итак, в вашем случае попробуйте использовать метод filterXPath:

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