簡體   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