【发布时间】:2017-03-01 08:37:51
【问题描述】:
我有一个运行良好的 PHP dom 网络爬虫。它从(外部)论坛站点提取提到的标签及其链接到我的页面。
但最近我遇到了一个问题。喜欢
这是论坛数据的 HTML::
<tbody>
<tr>
<td width="1%" height="25"> </td>
<td width="64%" height="25" class="FootNotes2"><a href="/files/forum/2017/1/837880.php" target="_top" class="Links2">Hispanic Study Partner</a> - dreamer1984</td>
<td width="1%" height="25"> </td>
<td width="14%" height="25" class="FootNotes2" align="center">02/28/17 01:42</td>
<td width="1%" height="25"> </td>
<td width="8%" height="25" align="Center" class="FootNotes2">0</td>
<td width="1%" height="25"> </td>
<td width="9%" height="25" align="Center" class="FootNotes2">200</td>
</tr>
<tr>
<td width="1%" height="25"> </td>
<td width="64%" height="25" class="FootNotes2"><a href="/files/forum/2017/1/837879.php" target="_top" class="Links2">nbme</a> - monariyadh</td>
<td width="1%" height="25"> </td>
<td width="14%" height="25" class="FootNotes2" align="center">02/27/17 23:12</td>
<td width="1%" height="25"> </td>
<td width="8%" height="25" align="Center" class="FootNotes2">0</td>
<td width="1%" height="25"> </td>
<td width="9%" height="25" align="Center" class="FootNotes2">108</td>
</tr>
</tbody>
现在,如果我们将上述代码(表格数据)视为该站点中唯一可用的语句。如果我尝试使用网络爬虫来提取它,
<?php
require_once('dom/simple_html_dom.php');
$html = file_get_html('http://www.sitename.com/');
foreach($html->find('td.FootNotes2') as $element) {
echo $element;
}
?>
它提取里面的所有数据,类名为“FootNote2”
现在,如果我想从第一个标签/行中提取标签中的特定数据,例如“dreamer1984”和“monariyadh”之类的名称。
如果我想从具有相同类名的 3rd(跳过其余部分)中提取数据怎么办。
请注意,我可以像使用“正则表达式”一样
preg_match_all('/<td.+?FootNotes2.+?<a.+?<\/a> - (?P<name>.*?)<\/td>.+?<td.+?FootNotes2.+?(?P<date>\d{2}\/\d{2}\/\d{2} \d{2}:\d{2})/siu', $subject, $matchs);
foreach ($matchs['name'] as $k => $v){
var_dump('name: '. $v, 'relative date: '. $matchs['date'][$k]);
}
但我更喜欢在 DOM 解析器中找到解决方案... 任何帮助表示赞赏..
【问题讨论】:
-
某种文本解析是必要的(例如通过正则表达式)我认为您无法避免这种情况。您可以做的最好的事情是将正则表达式位限制为 td 元素的文本内容。
-
@harishk 检查我的答案是你想要的吗?
标签: php web-crawler simple-html-dom