代码之家  ›  专栏  ›  技术社区  ›  Kermit

如何解析节点的属性

  •  0
  • Kermit  · 技术社区  · 2 年前

    我正试图提取 href 内部链接的属性 span ,但得到错误: Uncaught Error: Call to a member function getElementsByTagName()

        $sample_html = <<<HTML
    <div class="link-to-flavors">
        <span class="flavor-banner"></span>
        <span class="flavor-space"></span>
        <span class="flavor-title"><span><a href="flavors.com/vanilla" class="flavor-link">Vanilla</a></span></span>
        <span class="flavor-price">$1.99</span>
        <span class="flavor-icons icons-inrow"></span>
    </div>
    <div class="link-to-flavors">
        <span class="flavor-banner"></span>
        <span class="flavor-space"></span>
        <span class="flavor-title"><span><a href="flavors.com/strawberry" class="flavor-link">Strawberry</a></span></span>
        <span class="flavor-price">$2.99</span>
        <span class="flavor-icons icons-inrow"></span>
    </div>
    HTML;
    
        // Create a DOMDocument
        @$dom = new DOMDocument( );
    
        // Handle HTML5/svg errors
        libxml_use_internal_errors( true );
    
        // Load HTML 
        $dom->loadHTML( $sample_html );
    
        $xpath = new DOMXPath( $dom );
        $xpath_query = '//div[@class="link-to-flavors"]';
        $obj_div_flavors = $xpath->query( $xpath_query );
    
        if( !is_null($obj_div_flavors) ) {
            $result_array = array( );
    
            foreach( $obj_div_flavors as $obj_div_flavor_each ) {
                $obj_div_flavor_spans = $obj_div_flavor_each->getElementsByTagName( 'span' );
    
                $flavor_title = null;
                $flavor_link = null;
                $flavor_price = null;
    
                foreach( $obj_div_flavor_spans as $obj_div_flavor_span_each ) {
                    if( stripos($obj_div_flavor_span_each->getAttribute('class'), 'flavor-title') !== false ) {
                        $flavor_title = $obj_div_flavor_span_each->textContent;
                    }
    
                    if( stripos($obj_div_flavor_span_each->getAttribute('class')->getElementsByTagName('a')->getAttribute('href'), 'flavor-title') !== false ) {
                        $flavor_link = $obj_div_flavor_span_each->textContent;
                    }
    
                    if( stripos($obj_div_flavor_span_each->getAttribute('class'), 'flavor-price') !== false ) {
                        $flavor_price = $obj_div_flavor_span_each->textContent;
                    }
                }
    
                $result_array[] = array( 'flavor_title' => $flavor_title, 'flavor_link' => $flavor_link, 'flavor_price' => $flavor_price );
            }
    
            print_r( $result_array );
        }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   ezw    2 年前
    $sample_html = <<<HTML
    <div class="link-to-flavors">
        <span class="flavor-banner"></span>
        <span class="flavor-space"></span>
        <span class="flavor-title"><span><a href="flavors.com/vanilla" class="flavor-link">Vanilla</a></span></span>
        <span class="flavor-price">$1.99</span>
        <span class="flavor-icons icons-inrow"></span>
    </div>
    <div class="link-to-flavors">
        <span class="flavor-banner"></span>
        <span class="flavor-space"></span>
        <span class="flavor-title"><span><a href="flavors.com/strawberry" class="flavor-link">Strawberry</a></span></span>
        <span class="flavor-price">$2.99</span>
        <span class="flavor-icons icons-inrow"></span>
    </div>
    HTML;
    
        // Create a DOMDocument
        @$dom = new DOMDocument( );
    
        // Handle HTML5/svg errors
        libxml_use_internal_errors( true );
    
        // Load HTML 
        $dom->loadHTML( $sample_html );
    
        $xpath = new DOMXPath( $dom );
        $xpath_query = '//div[@class="link-to-flavors"]';
        $obj_div_flavors = $xpath->query( $xpath_query );
    
        if( !is_null($obj_div_flavors) ) {
            $result_array = array( );
    
            foreach( $obj_div_flavors as $obj_div_flavor_each ) {
                $obj_div_flavor_spans = $obj_div_flavor_each->getElementsByTagName( 'span' );
    
                $flavor_title = null;
                $flavor_link = null;
                $flavor_price = null;
    
                foreach ($obj_div_flavor_spans as $obj_div_flavor_span_each) {
                    if (stripos($obj_div_flavor_span_each->getAttribute('class'), 'flavor-title') !== false) {
                        // Get the <a> element within the 'flavor-title' span
                        $flavor_link_element = $obj_div_flavor_span_each->getElementsByTagName('a')->item(0);
                
                        if ($flavor_link_element) {
                            $flavor_link = $flavor_link_element->getAttribute('href');
                        }
                
                        $flavor_title = $obj_div_flavor_span_each->textContent;
                    }
                
                    if (stripos($obj_div_flavor_span_each->getAttribute('class'), 'flavor-price') !== false) {
                        $flavor_price = $obj_div_flavor_span_each->textContent;
                    }
                }
    
                $result_array[] = array( 'flavor_title' => $flavor_title, 'flavor_link' => $flavor_link, 'flavor_price' => $flavor_price );
            }
    
            print_r( $result_array );
        }
    
    推荐文章