【问题标题】:PHP DOM parser get data from a spanPHP DOM 解析器从跨度获取数据
【发布时间】:2011-11-30 03:22:10
【问题描述】:

我正在尝试使用 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”部分,这是我所处理的所有额外代码,所以没有一个被它甩了。

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

【问题讨论】:

    标签: php html dom expression


    【解决方案1】:

    这个:

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

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

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

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

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

    【讨论】:

    • 我会避免说 DOMXPath 更容易,更不用说它更干净了。它更强大,但更容易?嗯……
    • 是的,我认为那条线不会做我想要的,这是最后一次尝试。 $html 是我需要的任何网站的 html..." $html = file_get_html($fp);"是的,我确实稍微研究了一下 xpath,但它似乎并不容易,但我现在要试试你的建议,谢谢
    • @Tom,我认为 XPath 既简单又清晰。对于比getElementById 更复杂的东西,使用 DOM 是一团糟。
    • @user1070764,$html 真的只是一个字符串吗?您需要将其加载到DOMDocument!您的其他解析如何工作?
    • @francisAvilla,关于 $html 我猜是这样,在尝试了 DomDocument 和 xpath 几种不同的方式之后,它无法与我正在做的事情一起工作,我发现 simple_html_dom.php 就像没有任何示例的魅力一样或需要 DOMDoc。另一方面,您的解决方案有效,谢谢,我什至不需要 textContent 行,所以它只是那一行,我真的想多了。再次感谢
    【解决方案2】:

    应避免使用简单的 Html Dom,除非您使用的是 PHP 版本

    迭代该 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";
    }
    

    【讨论】:

    • 谢谢你..现在我只想让它工作,因为它只是一个更大项目的一小部分,但我想要优化它,所以感谢这个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2012-08-24
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多