【问题标题】:Selective data extraction from forum site using DOM PHP web crawler使用 DOM PHP 网络爬虫从论坛站点选择性提取数据
【发布时间】:2017-02-28 14:12:24
【问题描述】:

我有一个运行良好的 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”等名称。

如果我想从具有相同类名的 3rd(跳过其余部分)中提取数据怎么办。

希望我能清楚地理解问题。

任何帮助表示赞赏..

【问题讨论】:

    标签: php dom web-crawler


    【解决方案1】:

    我建议你使用regex

    这是您需要的示例

    $subject = <<<EOF
    <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>
    EOF;
    
    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]);
    }
    

    【讨论】:

    • 您需要更改我的代码,这只是一个示例。试试这个:$subject = file_get_html('http://www.sitename.com/');
    • 我刚刚用我的代码替换了你的代码。它将数据打印为字符串()数字..完全混乱......
    • 我再说一遍,这只是一个代码示例,现在您需要根据您的用例对其进行调整。现在你有$matchs['name'] 和他在$matchs['date'] 数组中的相对日期。尝试将此数组用于您的案例
    • 老兄,在这个问题上问更多是愚蠢的,但我对此完全陌生,你能为我做一个吗,会理解它并将其应用于我的其他网站..
    • 是的,但我需要一个输出示例,说明您在代码解析 html 后想要的内容
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2013-11-23
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多