Web Scrape Symfony2 — Невозможное испытание — Гусеничный разбор

(Редактировать: я до сих пор не нашел способа решить эту проблему. $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, которую я читал около тысячи раз. Пожалуйста помоги.

0

Решение

Учитывая приведенный выше фрагмент 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]

Настоящая проблема заключалась в том, что вокруг «Заголовка события» было ведущее и конечное пустое место.

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

0

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