PHP DOM解析器从span获取数据

时间:2011-11-29 07:21:40

标签: 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?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中可以看出,网站即时解析对于其某些跨度(ctl10_gv_sectionTable_ctl03_lblRoom)具有非常独特的ID。由于我只发布了1个部分的HTML块,你没看到的是下一个类部分的代码是相同的,除了“ctl03”部分,这是我所有的额外代码所处理的,所以没有一个被它抛弃了。

我尝试了几种不同的方法,但似乎无法获得日子(即“上午10点至11点25分”)或房间(即KUPF106)。其余的东西很容易抓住,但这两个没有类标识符甚至是td标识符。我想我只需要知道如何使用我在$ id中的值作为我正在寻找的特定跨度ID?如果是这样,有人可以告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:2)

这:

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

毫无意义。 getElementByTagName返回DOMList,其中没有getElementById方法。

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

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

您是否考虑过使用DOMXPath进行解析任务?它可能很多更容易和更清晰。

答案 1 :(得分:0)

除非你使用的是Php版本&lt; = 4,否则应该避免使用简单的Html Dom.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";
}