Как отфильтровать значения дочерних узлов из родительского div, где style = & quot; … & quot; используя 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');

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

2

Решение

DomCrawler фильтр метод будет

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

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

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]