PHP DOM解析器从一个范围中获取数据
我正在尝试使用DOM从以下一批HTML中获取日期、时间和房间(我实际上获取了脚本中的所有内容,但获取这两个我有问题):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
</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";
}