PHP DOM解析器从一个范围中获取数据

PHP DOM解析器从一个范围中获取数据,php,html,dom,expression,Php,Html,Dom,Expression,我正在尝试使用DOM从以下一批HTML中获取日期、时间和房间(我实际上获取了脚本中的所有内容,但获取这两个我有问题): </td><td class="call"> <span>12549<br/></span><a href="http://www.bkstr.com/webapp/wcs/stores/servlet/booklookServlet

我正在尝试使用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 />

12549
上午十时至上午十一时二十五分 KUPF106
KUPF106 关闭2049 3 101
这是我到目前为止找到的时间

    $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;
        }
    }
$tracker=0;
//日子和时间
$number=3;
$digit=“0”;
而($trackerfind('span.$id');
$days=$html->getElementByTagName('span')->getElementById($id);
回声“天:”;
回显$days[0]。
; $tracker++; $number++; 如果($number>9){ $digit=“1”; $number=0; } }
正如您从HTML中看到的,站点im解析的某些跨度(ctl10_gv_sectionTable_ctl03_lblRoom)具有非常独特的ID。由于我只发布了1个部分的HTML块,您没有看到的是,下一个类部分的代码除了“ctl03”之外是相同的部分,这就是我所有额外的代码所处理的,只是为了不让任何人被它抛弃

我尝试了几种不同的方法,但似乎无法获得白天(即“上午1000点-上午11点25分”)或房间(即KUPF106)。剩下的东西很容易抓取,但这两个都没有类标识符,甚至没有td标识符。我想我只需要知道如何使用$id中的值作为我要查找的特定span id?如果是,有人能告诉我怎么做吗?

这个:

$html->getElementByTagName('span')->getElementById($id);
没有意义。
getElementByTagName
返回一个
DOMList
,它没有
getElementById
方法

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

拥有元素后,如果不需要在文本节点之间走动,可以使用
$element->textContent
获取文本值


你有没有考虑过在解析任务中使用
DOMXPath
?它可能更简单、更清晰。

除非你使用Php版本,否则应该避免使用简单的Html Dom。我会避免关于DOMXPath更简单的说法,更不用说它更干净了。它功能更强大,但更简单?嗯……是的,我认为这行没有用为了达到我的目的,这是我最后一次尝试。而$html是我需要的任何网站的html…$html=file\u get\u html($fp);”是的,我确实研究了xpath,它看起来并不容易,但我现在要试试你的建议,thanks@Tom,我认为XPath既简单又清晰。对于任何比
getElementById
@user1070764更复杂的东西,使用DOM都是一团糟,
$html
真的只是一个字符串吗?您需要将其加载到
DOMDocument中!您的其他解析工作如何?@francisAvilla,大约$html我想是的,在尝试了DomDocument和xpath几种不同的方法后,我发现simple_html_dom.php工作得很好,没有任何DOMDock的示例或需要。另一方面,您的解决方案工作正常,谢谢,我甚至没有需要文本内容行,所以它只是那一行,我真的想得太多了。谢谢阿加因汉克斯。现在我只想让它工作,因为它是一个更大的项目的一小部分,但我想优化它,所以感谢这个例子。
$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";
}