(Редактировать: я до сих пор не нашел способа решить эту проблему. $crawler
объект кажется смешным работать, я просто хочу разобрать его для конкретного <td>
текст, как сложно это? Я не могу serialize()
либо весь объект-обходчик, и весь исходный код веб-страницы можно преобразовать в строку, иначе я мог бы просто разобрать эту строку сложным способом. Пожалуйста помоги. Я чувствую, что хорошо описал проблему ниже.)
Ниже я использую Symfony, Goutte и DomCrawler для очистки веб-страницы. Я пытался выяснить это с помощью других вопросов, но безуспешно, но сейчас я просто собираюсь опубликовать весь свой код, чтобы сделать это как можно более простым.
Я могу получить страницу и получить первый бит данных, которые я ищу. Первый — это URL, который напечатан из JavaScript и лежит в a
пометить с onclick
и длинная строка, поэтому я использую preg_match
просеять и получить именно то, что мне нужно.
Следующий бит данных мне нужен текст в <td>
тег. Дело в том, что эта веб-страница имеет 10-20 различных <table>
теги, а нет id=""
или же class=""
теги, поэтому трудно выделить. Итак, что я пытаюсь сделать, это искать слова «Название мероприятия» затем перейти к следующему брату <td>
отметьте и извлеките innerHtml того, что будет фактическим заголовком.
Проблема в том, что для второй части я не могу разобрать $crawler
объект. Я не понимаю, я сделал preg_match
прежде чем на serialize()
версия $crawler
объект, но для нижней половины я не могу разобрать правильно.
$crawler = $client->request('GET', 'https://movies.randomjunk.com/events/EventServlet?ab=mov&eventId=154367');$aurl = 'http://movies.randomjunk.com/r.htm?e=154367'; // event url beginning string
$gas = $overview->filter('a[onclick*="' . $aurl . '"]');
$string1 = serialize($gas->filter('a')->attr('onclick')); //TEST
$string1M = preg_match("/(?<=\')(.*?)(?=\')/", $string1, $finalURL);
$aString = $finalURL[0];
echo "<br><br>" . $aString . "<br><br>";
// IT WORKS UP TO HERE// $title = $crawler->filterXPath('//td[. = "Event Title"]/following-sibling::td[1]')->each(funtion (Crawler $crawler, $i) {
// return $node->text();
// }); // No clue why, but this doesn't work.
$html = $overview->getNode(0)->ownerDocument->saveHTML();$re = "/>Event\sTitle.*?<\\/td>.*?<td>\\K.*?(?=<\\/td>)/s";
$str = serialize($html);
print_r($str);
preg_match_all($re, $str, $matches);
$gas2 = $matches[0];echo "<pre>";
print_r($gas2);
echo "</pre>";
мой preg_match
просто возвращает пустой массив. Я думаю, что это проблема с поиском $crawler
объект, так как он состоит из множества узлов. Я пытался просто преобразовать все это в HTML, а затем в preg_match
но он просто отказывается работать. Я сделал несколько print_r
заявления, и он просто возвращает всю веб-страницу.
Вот пример некоторых html в стороне объекта crawler:
{lots of other html and tables}
<table>
<tr>
<td>Title</td>
<td>The Harsh Face of Mother Nature</td>
<td>The Harsh Face of Mother Nature</td>
</tr>
.
.
</table>
{lots of other html and tables}
И цель состоит в том, чтобы разобрать всю страницу /$crawler
возразить и получить титул «Суровое лицо матери-природы».
Я знаю, что это должно быть возможно, но единственный ответ, который кто-то хочет дать, — это ссылка на страницу domcrawler, которую я читал около тысячи раз. Пожалуйста помоги.
Учитывая приведенный выше фрагмент HTML, я смог придумать XPath:
//table/tr/td[.='Title']/following-sibling::td[1]
Вы можете протестировать XPath с помощью предоставленного фрагмента HTML на Вот
$html = '<table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table>';
$crawler = new Symfony\Component\DomCrawler\Crawler($html);
$query = "//table/tr/td[.='Event Title']/following-sibling::td[1]";
$crawler->filterXPath($query)->each(function($crawler, $i) {
echo $crawler->text() . PHP_EOL;
});
Какие выводы:
The Harsh Face of Mother Nature
The Harsh Face of Mother Nature
The Harsh Face of Mother Nature
Обновление: успешно протестировано с:
$html = '<html><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table><table><tr><td>Event Title</td><td>The Harsh Face of Mother Nature</td><td>The Harsh Face of Mother Nature</td></tr></table></html>';
Обновление: после того, как я получил образец HTML-кода с веб-сайта, я смог разобраться в следующем XPath:
//td[normalize-space(text()) = 'Event Title']/following-sibling::td[1]
Настоящая проблема заключалась в том, что вокруг «Заголовка события» было ведущее и конечное пустое место.
Хорошо, что вы можете сделать, это использовать класс в вашем:
<td class="mytitle">The Harsh Face of Mother Nature</td>
Который вы будете использовать для фильтрации вашего сканера, чтобы получить все ваши заголовки в массиве следующим образом:
$titles = $crawler->filter('td.mytitle')->extract(array('_text'));
где td.mytitle — это селектор CSS, выберите td с помощью класса mytitle и извлеките _text, который ссылается на текст внутри узла.
Легче и эффективнее, чем регулярные выражения …
Не проверял этот код, но он должен работать, вы можете получить дополнительную помощь и дополнительную информацию о сканере здесь:
http://symfony.com/fr/doc/current/components/dom_crawler.html