无法使用PHP简单DOM仅获取页面上的第二个列表
我使用以下代码尝试提取页面上的列表:无法使用PHP简单DOM仅获取页面上的第二个列表,php,html,dom,web-scraping,Php,Html,Dom,Web Scraping,我使用以下代码尝试提取页面上的列表: $websiteURL = "https://waset.org/conferences-in-january-2022-in-tokyo"; $html = file_get_html($websiteURL); foreach ( $html->find( 'ul') as $ul ) { foreach($ul->find('li') as $li) { echo "LI: " . $li . "<br&g
$websiteURL = "https://waset.org/conferences-in-january-2022-in-tokyo";
$html = file_get_html($websiteURL);
foreach ( $html->find( 'ul') as $ul ) {
foreach($ul->find('li') as $li) {
echo "LI: " . $li . "<br>";
}
}
我得到:
“调用int上的成员函数find()”
。。。这表明find('ul',1)
没有返回任何内容,但我不知道为什么
注意:此页面上有两个以上的列表
有人知道我做错了什么吗?要回答您的问题“我想我的底线问题是如何从网页的第二个页面访问所有
”,请使用一个相对现代、支持良好且内置于PHP中的API:
<?php
$url = "https://waset.org/conferences-in-january-2022-in-tokyo";
libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHtmlFile($url);
$lists = $dom->getElementsByTagName("ul");
$items = $lists[1]->getElementsByTagName("li");
foreach ($items as $item) {
// clean up extra whitespace
$text = preg_replace("/\s+/", " ", trim($item->textContent));
echo "$text\n------\n";
}
还值得注意的是,会议名称位于
元素中,位置位于
元素中,日期紧随其后。使用此方法,您可以非常简单地提取数据:
function getNodeText(\DomNode $node): string
{
$return = "";
foreach($node->childNodes as $child) {
if ($child->nodeName === "#text") {
$return .= trim($child->nodeValue);
}
}
return $return;
}
foreach ($items as $item) {
$conference = getNodeText($item->getElementsByTagName("a")[0]);
$location = getNodeText($item->getElementsByTagName("span")[0]);
$date = getNodeText($item);
echo "------\n$conference | $location | $date\n";
}
输出:
------
ICA2022年:航空物理学会议,东京(2022年1月7-08日)
------
2022年国际农林协会:农林业和应用会议,东京(2022年1月7-08日)
------
ICAAAA 2022:应用空气动力学、航空和航天会议,东京(2022年1月7-08日)
------
ICAAAE 2022:水生动物和水产养殖工程会议,东京(2022年1月7-08日)
------
ICAAC 2022:天文学计算进展会议,东京(2022年1月7-08日)
...
不,这并不意味着,它意味着无论你在那里调用什么方法,都只是一个整数值。为什么你要说你替换了第二个foreach,检查ul
元素的那一个是你原始代码中的第一个?根据文档,find('ul',1)
以这种方式使用应该只返回一个对象作为开始,而不是一个数组-因此仍然尝试循环,这在一开始可能没有多大意义。。。对不起,第一个foreach!我的错。谢谢你的回答,我会看一看-欣赏它作为旁注:我会建议一个更好的选择,使用DOMDocument
代替标题。假设我的底线问题是如何从网页上的第二个- 访问所有
- ?
function getNodeText(\DomNode $node): string { $return = ""; foreach($node->childNodes as $child) { if ($child->nodeName === "#text") { $return .= trim($child->nodeValue); } } return $return; } foreach ($items as $item) { $conference = getNodeText($item->getElementsByTagName("a")[0]); $location = getNodeText($item->getElementsByTagName("span")[0]); $date = getNodeText($item); echo "------\n$conference | $location | $date\n"; }