Я пытаюсь почистить цитаты с данной страницы википедии с помощью пакета 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');
Но это не возвращает значения узлов, которые мне нужны. Кто-нибудь знает как это сделать или что я делаю не так?
DomCrawler фильтр метод будет
Фильтрует список узлов с помощью селектора CSS.
который менее мощный, чем использование xpath. Я полагаю, что селектор CSS не смог преобразовать ваш сложный запрос в выражения xpath. Таким образом, сложный фильтр должен быть сделан filterXPath метод вместо которого будет
Фильтрует список узлов с выражением XPath.
Итак, в вашем случае, попробуйте использовать filterXPath
метод:
$crawler->filterXPath("//div[contains(@style,'padding: .5em; border: 1px solid black; background-color:#FFE7CC')]");
Других решений пока нет …