无法使用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";
      }