【问题标题】:Scrape HTML table data and create XML doc抓取 HTML 表格数据并创建 XML 文档
【发布时间】:2011-11-10 02:41:13
【问题描述】:

我需要从网站上的表格中抓取一些网站数据并创建一个将由应用程序使用的 XML 文档。

表格如下所示:

<table id="results" class="results">
        <thead>
            <tr>
                <th scope="col" class="resRoute">Route</th>
                <th scope="col" class="resDir">To</th>
                <th scope="col" class="resDue sorted">Time</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="resRoute">263</td>
                <td class="resDir">Route Name</td>
                <td class="resDue">1 min</td>
            </tr>
            <tr>
                <td class="resRoute">17</td>
                <td class="resDir">Route Name</td>
                <td class="resDue">2 min</td>
            </tr>
        </tbody>
    </table>

我想创建一个如下所示的 XML 提要:

<train>
    <route>263</route>
    <direction>Route Name</direction>
    <due>2 Min</due>
</train>
<train>
    <route>17</route>
    <direction>Route Name</direction>
    <due>12 Min</due>
</train>

【问题讨论】:

    标签: php xml xpath screen-scraping


    【解决方案1】:

    通过 XSLT 转换运行它:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <xsl:for-each select="table/tbody/tr">
          <train>
            <route><xsl:value-of select="td[@class='resRoute']" /></route>
            <direction><xsl:value-of select="td[@class='resDir']" /></direction>
            <due><xsl:value-of select="td[@class='resDue']" /></due>
          </train> 
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案2】:

      hack hackedy hack hack hack!

              $html = '<table id="results" class="results">
                  <thead>
                      <tr>
                          <th scope="col" class="resRoute">Route</th>
                          <th scope="col" class="resDir">To</th>
                          <th scope="col" class="resDue sorted">Time</th>
                      </tr>
                  </thead>
                  <tbody>
                      <tr>
                          <td class="resRoute">263</td>
                          <td class="resDir">Route Name</td>
                          <td class="resDue">1 min</td>
                      </tr>
                      <tr>
                          <td class="resRoute">17</td>
                          <td class="resDir">Route Name</td>
                          <td class="resDue">2 min</td>
                      </tr>
                  </tbody>
              </table>
          ';
      
          $body = explode('<tbody>', $html);
      
          $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><xml />");
      
          $rows = array();
          foreach (array_slice(explode('<tr>', end($body)), 1) as $row)
          {
              preg_match('/resRoute">([0-9]+)<\/td>/', $row, $ids);
              preg_match('/resDir">([^<]+)<\/td>/', $row, $dir);
              preg_match('/resDue">([^<]+)<\/td>/', $row, $due);
      
              $node = $xml->addChild('train');
      
              $node->addChild('route', $ids[1]);
              $node->addChild('direction', $dir[1]);
              $node->addChild('due', $due[1]);
          }
      
          header('Content-Type: text/xml');
          echo $xml->asXML();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 2012-02-04
        • 2021-03-04
        • 1970-01-01
        • 2018-12-26
        • 2020-11-08
        • 2016-12-06
        相关资源
        最近更新 更多