繁体   English   中英

使用xpath php和domdocument获取特定表的内部内容来抓取数据

[英]scraping data using xpath php and domdocument gettin inner content of certain table

有一个我需要数据的外部页面。 您可以通过餐厅订单获得某种类型的列表。 现在此页面上有表格...每个表格都有一个类,用于说明表格的类型,例如“已交付的订单”

在这些选项卡中有行和tds ..我需要为我的数据数组每一行的td值...

所以我该怎么办..我用类状态厨房执行xpath查询以获取表的内容。 <td class="orderode">0000</td> ...但是现在我需要此表中的所有行和tds ...按类分开,例如<td class="orderode">0000</td>我需要在数组中作为'ordercode' => val ..所以我用另一个xpath查询在循环内做了另一个循环

但是现在我不仅看到了厨房的所有订购代码...因为它再次解析了整个html ...我只想对父级的foreach结果或其他内容进行查询。我该怎么办?

$result = array();
$html = $sc->login(); //curl result
$dom = new DOMDocument;
$dom->loadHTML($html);
$xPath = new DOMXPath($dom);

$classname = "order-link wide status-kitchen";
$td = $xPath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");

foreach($td as $val){

    $classname = "code order-code";
    $td2 = $xPath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
    foreach($td2 as $v){

        $result[] = $v->nodeValue;
    }
}

print_r($result);

HTML外观的示例:

/ *厨房订购清单* /

<table class="order-list">
      <tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> // REPEAT
        <tr>
          <td class="time">17:43</td>
          <td class="time-delivery ">
            18:45           </td>
          <td class="code order-code">00000</td>
          <td>address data</td>
          <td class="distance">
                        </td>
          <td class="amount">€ 29,75</td>
        </tr>
      </tbody>
      <tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
        <tr>
          <td class="time">17:43</td>
          <td class="time-delivery ">
            18:45           </td>
          <td class="code order-code">00000</td>
          <td>address data</td>
          <td class="distance">
                        </td>
          <td class="amount">€ 29,75</td>
        </tr>
      </tbody>
</table>

/*order list deliverd */
<table class="order-list">
      <tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
        <tr>
          <td class="time">17:43</td>
          <td class="time-delivery ">
            18:45           </td>
          <td class="code order-code">00000</td>
          <td>address data</td>
          <td class="distance">
                        </td>
          <td class="amount">€ 29,75</td>
        </tr>
      </tbody>
      <tbody class="order-link wide status-kitchen" rel="#oQOP3PRN511"> //REPEAT
        <tr>
          <td class="time">17:43</td>
          <td class="time-delivery ">
            18:45           </td>
          <td class="code order-code">00000</td>
          <td>address data</td>
          <td class="distance">
                        </td>
          <td class="amount">€ 29,75</td>
        </tr>
      </tbody>

要从DOM中的给定节点开始运行第二个xpath查询,请从开始查询. 并将上下文节点作为第二个参数传递给query()

例:

$td2 = $xPath->query(".//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]", $val);

您要避免使用HTML DOM和类似的东西进行HTML抓取,因为它们不会处理某些类型的无效HTML,尤其是表有问题。

获取所有trs:

preg_match_all( '~<tr.*?>(.*?)<\/tr>~is', $page, $trs );
foreach( $trs as $tr )
{
    preg_match_all( '~<td.*?>(.*?)<\/td>~is', $tr, $tds );
    print_r( $tds );
}

这将获取所有TR元素,具有任何属性或没有属性以及任何内部HTML或没有内部HTML。 i标志表示不区分大小写,而s标志表示它将包含\\ n in。 火柴。 然后对于TD同样。

看到我在这里发布的做同样事情的课程:

获取内部HTML-PHP

尽管我已经好几年没有使用它了,但是我不确定该使用哪个功能。 我只是单独使用reg ex。

更新 :使用上面的类:

$c = new HTMLQuery( $html );
$tbs = $c->getElements( 'tbody', 'class', 'order-link wide status-kitchen' );
print_r( $tbs );
// you could then call a new HTMLQuery and query trs, etc., or:
foreach( $tbs as $tb )
{
    preg_match_all( '~<tr.*?>(.*?)<\/tr>~is', $tb, $trs );
    foreach( $trs as $tr )
    {
        preg_match_all( '~<td.*?>(.*?)<\/td>~is', $tr, $tds );
        print_r( $tds );
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM