【发布时间】:2015-03-26 15:41:11
【问题描述】:
(编辑:我仍然没有找到解决这个问题的方法。$crawler 对象似乎很荒谬,我只想解析它以获取特定的 <td> 文本,这有多难?我也不能serialize()整个爬虫对象并将网页的整个源代码变成一个字符串,否则我只能用困难的方式解析那个字符串。请帮忙。我觉得我已经很好地描述了这个问题,下面。)
下面我使用 Symfony、Goutte 和 DomCrawler 来抓取网页。我一直试图通过其他问题来解决这个问题,但没有成功,但现在我将发布我所有的代码,以使其尽可能直截了当。
我能够获取该页面并获取我正在寻找的第一个数据。第一个是从 javascript 打印的 url,带有一个带有 onclick 的 a 标签,并且是一个长字符串,所以我使用 preg_match 来筛选并得到我需要的东西。
我需要的下一点数据是<td> 标记中的一些文本。问题是,这个网页有 10-20 个不同的 <table> 标签,并且没有 id="" 或 class="" 标签,所以很难隔离。所以我要做的是搜索单词 "Event Title" 然后转到下一个兄弟<td> 标签并提取它的innerHtml,这将是实际的标题。
问题在于,对于第二部分,我似乎无法正确解析 $crawler 对象。我不明白,我之前在serialize() 版本的$crawler 对象上做了一个preg_match,但是对于下半部分,我似乎无法正确解析。
$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 示例:
{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}
而目标是解析整个 page/$crawler 对象并得到标题“大自然的严酷面孔”。
我知道这一定是可能的,但任何人都想提供的唯一答案是指向 domcrawler 页面的链接,此时我已经阅读了大约一千次。请帮忙。
【问题讨论】:
-
您究竟需要从这一切中获得哪些数据?标题?
-
在底部我列出了目标,从
<td>大自然母亲的严酷面孔中获得标题。这将是动态的并且一直在变化,但之前的<td>将保持不变,<td>Title</td>。所以我必须找到<td>,然后去找它的下一个兄弟,然后就会有我的答案。
标签: php regex symfony web-scraping domcrawler