PHP DOM解析器从span中获取数据


PHP DOM parser get data from a span

我正试图使用DOM来获取日期和时间以及房间(我实际上在我的脚本中得到了所有东西,但它得到了这两个我有麻烦)从以下一批HTML:

                    </td><td class="call">
                    <span>12549<br/></span><a href="http://www.bkstr.com/webapp/wcs/stores/servlet/booklookServlet?bookstore_id-1=584&term_id-1=201190&crn-1=12549" target="_blank">View Book Info</a>
                    </td><td>
                    <span id="ctl10_gv_sectionTable_ctl03_lblDays">F:1000AM - 1125AM<br />T:230PM - 355PM</span>

                    </td><td class="room">
                    <span id="ctl10_gv_sectionTable_ctl03_lblRoom">KUPF106<br />KUPF106</span>
                    </td><td class="status"><span id="ctl10_gv_sectionTable_ctl03_lblStatus" class="red">Closed</span></td><td class="max">20</td><td class="now">49</td><td class="instructor">
                    <a href="https://directory.njit.edu/PersDetails.aspx?persid=SCHOENKA" target="_blank">Schoenebeck Kar</a>
                    </td><td class="credits">3.00</td>
        </tr><tr class="sectionRow">
            <td class="section">
                    101<br />

这是我目前找到的天数

    $tracker =0;
    // DAYS AND TIMES
    $number = 3;
    $digit = "0";
    while($tracker<$numSections){           
        $strNum = strval($number);
        $zero = strval($digit);
        $start = "ctl10_gv_sectionTable_ctl";
        $end = "_lblDays";
        $id = $start.$zero.$strNum.$end;
        //$days = $html->find('span.$id');
        $days=$html->getElementByTagName('span')->getElementById($id);
            echo "Days : ";
            echo $days[0] . '<br>';

        $tracker++;
        $number++;
        if($number >9){
            $digit = "1";
            $number=0;
        }
    }

从HTML中可以看到,站点im解析的一些span (ctl10_gv_sectionTable_ctl03_lblRoom)具有非常独特的ID。由于我只发布了1节的HTML块,您没有看到的是,下一个类部分的代码是相同的,除了"ctl03"部分,这是我所关心的所有额外代码,只是为了没有人被它抛弃。

我试过几种不同的方法,但似乎不能得到的日子(即。"上午1000AM - 1125AM")或房间(即KUPF106)。其余的东西很容易获取,但这两个没有类标识符,甚至没有td标识符。我想我只需要知道如何使用我在$id作为我正在寻找的特定span id的值?如果有的话,有人能告诉我怎么做吗?

This:

$html->getElementByTagName('span')->getElementById($id);

没有意义。getElementByTagName返回一个DOMList,它没有getElementById方法。

我认为你指的是$html->getElementById($id);,但我不能确定,因为我不知道$html是什么。

一旦有了元素,如果不需要遍历文本节点,就可以使用$element->textContent获取文本值。

您是否考虑过使用DOMXPath进行解析任务?

可能更容易、更清晰。

应该避免使用简单Html Dom,除非您使用的是Php版本<= 4。Php5中内置的Dom函数使用更可靠的libxml2库。

迭代html的正确方法是首先确定要迭代的行,然后编写xpath表达式来提取相对于该行的数据。

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DomXpath($dom);
foreach($xpath->query("//tr[@class='sectionRow']") as $row){
    echo $xpath->query(".//span[contains(@id,'Days')]",$row)->item(0)->nodeValue."'n";
    echo $xpath->query(".//span[contains(@id,'Room')]",$row)->item(0)->nodeValue."'n";
    echo $xpath->query(".//span[contains(@id,'Status')]",$row)->item(0)->nodeValue."'n";
}