使用DOM PHP Web爬网程序从外部站点选择性地提取数据

我有这个
PHP dom网络爬虫,工作正常.它从(外部)论坛网站到我的页面提取提到的标签及其链接.

但最近我遇到了一个问题.喜欢

这是论坛数据的HTML ::

<tbody>
<tr>
    <td width="1%" height="25">&nbsp;</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">&nbsp;</td>
    <td width="14%" height="25" class="FootNotes2" align="center">02/28/17 01:42</td>
    <td width="1%" height="25">&nbsp;</td>
    <td width="8%" height="25" align="Center" class="FootNotes2">0</td>
    <td width="1%" height="25">&nbsp;</td>
    <td width="9%" height="25" align="Center" class="FootNotes2">200</td>
</tr>
<tr>
    <td width="1%" height="25">&nbsp;</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">&nbsp;</td>
    <td width="14%" height="25" class="FootNotes2" align="center">02/27/17 23:12</td>
    <td width="1%" height="25">&nbsp;</td>
    <td width="8%" height="25" align="Center" class="FootNotes2">0</td>
    <td width="1%" height="25">&nbsp;</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”等名称.

如果我想从第3个(跳过其余的)提取具有相同类名的数据,该怎么办?

请注意,我可以使用“正则表达式”

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相关的文本元素,如下所示:

require_once('dom/simple_html_dom.php'); 
$html = file_get_html('http://www.sitename.com/');
foreach ($html->find("tr") as $row) {
        $element = $row->find('td.FootNotes2',0);
        if ($element == null) { continue; }
        $textNode = array_filter($element->nodes, function ($n) {
            return $n->nodetype == 3;        //Text node type, like in jQuery     
        });

        if (!empty($textNode)) {
            $text = current($textNode);
            echo $text;         
        }

    }  

这回应:

- dreamer1984
- monariyadh

做你想做的事.

更新为仅找到每个tr的第一个td.

点赞