Php Can';t使用简单的_html _DOM遍历DOM以查找并遍历表行

Php Can';t使用简单的_html _DOM遍历DOM以查找并遍历表行,php,parsing,dom,Php,Parsing,Dom,我有一个带有thead和tbody的表-前几行如下所示: <table class="general player-list-table"> <thead> <tr> <th width="20"></th> <th class="header-name"> <a href="playerlist.aspx?dpt=

我有一个带有
thead
tbody
的表-前几行如下所示:

<table class="general player-list-table">
    <thead>
        <tr>
            <th width="20"></th>
            <th class="header-name">
                <a href="playerlist.aspx?dpt=0&srt=1">Name</a>
            </th>
            <th width="20"></th>
            <th width="20"></th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=2">Club</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=3">Price</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=4">Rating</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=5" title="Games Played">PLD</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=6" title="Goals">GLS</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=7" title="Assists">ASS</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=8" title="Clean Sheets">CS</a>
            </th>
            <th>
                <a href="playerlist.aspx?dpt=0&srt=9" title="Goals Against">GA</a>
            </th>
            <th class="highlight">
                <a href="playerlist.aspx?dpt=0&srt=10" title="Month Points">MTH</a>
            </th>
            <th class="highlight header-tot">
                <a href="playerlist.aspx?dpt=0&srt=11" title="Overall total">TOT</a>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr class="on">
            <td class="first no-border">
                <div class="pos pos1"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/petr-cech.aspx">P Cech</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.2</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>34</td>
            <td>0</td>
            <td>0</td>
            <td>16</td>
            <td>31</td>
            <td class="highlight">2</td>
            <td class="highlight">35</td>
        </tr>
        <tr>
            <td class="first no-border">
                <div class="pos pos1"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/david-ospina.aspx">D Ospina</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.1</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>4</td>
            <td>0</td>
            <td>0</td>
            <td>2</td>
            <td>5</td>
            <td class="highlight">0</td>
            <td class="highlight">3</td>
        </tr>
        <tr class="on">
            <td class="first no-border">
                <div class="pos pos2"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/hector-bellerin.aspx">H Bellerin</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.2</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>36</td>
            <td>1</td>
            <td>5</td>
            <td>18</td>
            <td>33</td>
            <td class="highlight">4</td>
            <td class="highlight">52</td>
        </tr>
        <tr>
            <td class="first no-border">
                <div class="pos pos2"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/calum-chambers.aspx">C Chambers</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.1</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>4</td>
            <td>0</td>
            <td>0</td>
            <td>2</td>
            <td>3</td>
            <td class="highlight">0</td>
            <td class="highlight">5</td>
        </tr>
        <tr class="on">
            <td class="first no-border">
                <div class="pos pos2"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/kieran-gibbs.aspx">K Gibbs</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.2</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>3</td>
            <td>1</td>
            <td>0</td>
            <td>1</td>
            <td>6</td>
            <td class="highlight">0</td>
            <td class="highlight">2</td>
        </tr>
        <tr>
            <td class="first no-border">
                <div class="pos pos2"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/nacho-monreal.aspx">N Monreal</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.3</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>36</td>
            <td>0</td>
            <td>3</td>
            <td>17</td>
            <td>34</td>
            <td class="highlight">4</td>
            <td class="highlight">42</td>
        </tr>
        <tr class="on">
            <td class="first no-border">
                <div class="pos pos3"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/gabriel-armando-de-abreu.aspx">Gabriel</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.2</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>19</td>
            <td>1</td>
            <td>0</td>
            <td>10</td>
            <td>18</td>
            <td class="highlight">2</td>
            <td class="highlight">24</td>
        </tr>
        <tr>
            <td class="first no-border">
                <div class="pos pos3"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/laurent-koscielny.aspx">L Koscielny</a>
            </td>
            <td class="highlight"></td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.5</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>32</td>
            <td>4</td>
            <td>0</td>
            <td>15</td>
            <td>31</td>
            <td class="highlight">2</td>
            <td class="highlight">43</td>
        </tr>
        <tr class="on">
            <td class="first no-border">
                <div class="pos pos3"></div>
            </td>
            <td class="highlight">
                <a href="/Classic/Stats/Player/per-mertesacker.aspx">P Mertesacker</a>
            </td>
            <td class="highlight">
                <div class="right playerstatus doubtful" title="Hamstring"></div>
            </td>
            <td>
                <div class="left club-tiny club-tiny-arsenal"></div>
            </td>
            <td>
                <a href="/Classic/Stats/Club/arsenal.aspx">ARS</a>
            </td>
            <td class="highlight">4.4</td>
            <td>
                <div class="chilli normal"></div>
            </td>
            <td>23</td>
            <td>0</td>
            <td>0</td>
            <td>9</td>
            <td>24</td>
            <td class="highlight">0</td>
            <td class="highlight">17</td>
        </tr>
        <!-- etc -->
然而,这将产生:

PHP致命错误:未捕获错误:在/var/www/html/../foo.PHP:28中调用null上的成员函数find()

它指向foreach下的第一行:

$r["name"] = $row->find("td", 1)->find("a")->plaintext;

我如何才能做到这一点?

文档可能存在一些问题, 首先,您需要向tbody添加一个类,因为当您使用tbody标记查找行时,它也包括了thead的行,这就是为什么会出现此错误。 t车身标签现在更改为

<tbody class="tbody">
好的,现在它显示了.tbody中的所有行

但另一个问题是,当我解析行并调用a标记的find函数时,它返回当前行中所有a的对象,这意味着如果一行中有3个a,那么每个a对象将包含3个对象,您必须以第一个对象为目标,然后调用纯文本以获取其内容,现在您在foreach循环中的代码也更改为

foreach($dom->find("table.player-list-table .tbody tr") as $row){
$name = $row->find("td", 1)->find("a");
$r["name"] = $name[0]->plaintext;
$club = $row->find("td", 4)->find("a");
$r["club"] = $club[0]->plaintext;
$r["value"] = $row->find("td", 5)->plaintext;
我使用的是PHP版本5.3.10,所以我必须使用临时变量来存储对象

另外,如果您不想将类添加到tbody,您必须编辑simple_html_dom.php,下面是如何处理它的


希望这能帮助您解决问题。

文档可能存在一些问题, 首先,您需要向tbody添加一个类,因为当您使用tbody标记查找行时,它也包括了thead的行,这就是为什么会出现此错误。 t车身标签现在更改为

<tbody class="tbody">
好的,现在它显示了.tbody中的所有行

但另一个问题是,当我解析行并调用a标记的find函数时,它返回当前行中所有a的对象,这意味着如果一行中有3个a,那么每个a对象将包含3个对象,您必须以第一个对象为目标,然后调用纯文本以获取其内容,现在您在foreach循环中的代码也更改为

foreach($dom->find("table.player-list-table .tbody tr") as $row){
$name = $row->find("td", 1)->find("a");
$r["name"] = $name[0]->plaintext;
$club = $row->find("td", 4)->find("a");
$r["club"] = $club[0]->plaintext;
$r["value"] = $row->find("td", 5)->plaintext;
我使用的是PHP版本5.3.10,所以我必须使用临时变量来存储对象

另外,如果您不想将类添加到tbody,您必须编辑simple_html_dom.php,下面是如何处理它的


希望这能帮助您解决问题。

谢谢-我修改了您的代码,使每对代码都成为一行,例如:
$r[“name”]=$row->find(“td”,1)->find(“a”,0)->明文
通过指定
“a”,0)
我不需要将其存储在变量中!好的,很好,我从未使用过它,但它似乎是PHP的好工具,我将在即将到来的项目中尝试使用它:)谢谢-我修改了您的代码,使每对代码都变成一行,例如:
$r[“name”]=$row->find(“td”,1)->find(“a”,0)->明文
通过指定
“a”,0)
我不需要将其存储在变量中!好的,很好,我从未使用过它,但它似乎是PHP的好工具,我将尝试在即将到来的项目中使用它:)