【问题标题】:PHP Scraping PagePHP 抓取页面
【发布时间】:2010-11-25 03:45:02
【问题描述】:

我正在尝试抓取我要查找的信息所在的页面:

 <tr class="defRowEven">
   <td align="right">label</td>
   <td>info</td>
 </tr>

我正在尝试从页面中获取标签和信息。在我做类似的事情之前:

$hrefs = $xpath->evaluate("/html/body//a");

这就是我获取 URL 的方式。有没有办法获取tr 的信息?使用正则表达式还是使用DOMXPath 会更好吗?我对DOMXPath 非常陌生,任何信息都会很有帮助。谢谢!

【问题讨论】:

    标签: php dom xpath screen-scraping


    【解决方案1】:

    我不熟悉 xpath,但使用 SimpleHtmlDom 你可以这样做:

    foreach($html->find('tr.defRowEven') as $row) {
    
        //get the 'label' (first cell)
        echo $row->find('td', 0)->innerText;
    
        //get the 'info' (second cell)
        echo $row->find('td', 1)->innerText;
    }
    

    【讨论】:

    • 试过了,没有运气。只是一个空白屏幕。不过,我会继续与班级合作,谢谢!
    • @Frederico - 也许试试 echo $row->find('td', 0)->plainText;而是
    【解决方案2】:

    最近有人在 SO 提供了一个链接到 phpQuery .. 一种用于 php/server-side 的 jQuery .. 应该让这件事变得简单。我没试过,所以不能直接评论

    【讨论】:

      【解决方案3】:

      XPath 可以根据属性进行选择。然后,要找到您的行,请使用:

      $rows = $xpath->query("//tr[@class='defRowEven']");
      

      这应该返回一个行列表,因此您可以为每个行选择标签和信息,而不会混淆它们:

      foreach ($rows as $row) {
          $label = $xpath->evaluate("td[@align='right']", $row);
          $info = $xpath->evaluate("td[2]", $row);
      }
      

      如果不行,可以试试正则路由:

      preg_match_all('/<tr class="defRowEven">\s*<td align="right">(.*?)<\/td>\s*<td>(.*?)<\/td>/',
          $html, $matches, PREG_SET_ORDER);
      foreach ($matches as $match) {
          list($full, $label, $info) = $match;
      }
      

      【讨论】:

      • 尝试了第二个示例,但无法正常工作。不过我会继续努力的。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多