首页 文章

使用PHP从XML解析HTML表数据

提问于
浏览
2

我对PHP有些新意,但鉴于我的情况,我无法真正理解我在做错的事情 .

问题:我试图通过Reddit获取XML对象/元素内的字符串中某个HTML元素的href(如果您访问此页面,它将是视频的实际链接 - 而不是reddit链接,但是外部youtube链接或其他 - 没有别的) .

这是我到目前为止的代码(代码更新):

更新:循环狂热!得到了所有的href,但我现在正试图将它们存储在一个全局数组中,以访问此函数之外的随机数据 .

function getXMLFeed() {
    echo "<h2>Reddit Items</h2><hr><br><br>";
    //$feedURL = file_get_contents('https://www.reddit.com/r/videos/.xml?limit=200');
    $feedURL = 'https://www.reddit.com/r/videos/.xml?limit=200';
    $xml = simplexml_load_file($feedURL);
    //define each xml entry from reddit as an item
    foreach ($xml -> entry as $item ) {
        foreach ($item -> content as $content) {
            $newContent = (string)$content;    
            $html = str_get_html($newContent);

            foreach($html->find('table') as $table) {
                $links = $table->find('span', '0');
                //echo $links;
                foreach($links->find('a') as $link) {
                    echo $link->href;
                }
            }
        }
    }
}

XML代码:http://pasted.co/0bcf49e8

如果可以这样做,我还包括JSON;我只是喜欢XML:http://pasted.co/f02180db

这几乎就是所有的代码 . 虽然,这是我尝试使用DOMDocument的另一篇文章(废弃它) .

foreach ($item -> content as $content) {
       $dom = new DOMDocument();
       $dom -> loadHTML($content);
       $xpath = new DOMXPath($dom);
       $classname = "/html/body/table[1]/tbody/tr/td[2]/span[1]/a";



       foreach ($dom->getElementsByTagName('table') as $node) {
          echo $dom->saveHtml($node), PHP_EOL;
          //$originalURL = $node->getAttribute('href');
       }

       //$html = $dom->saveHTML();

    }

我可以很好地解析表,但是当获取某些元素的值(没有任何ID或类)时,我似乎只能获得所有锚标记或所有表行等 .

谁能指出我正确的方向?如果还有什么我可以在这里添加,请告诉我 . 谢谢!

添加HTML:我特意尝试从每个表/项中提取 <span><a href="https://www.youtube.com/watch?v=nZC4mXaosxM">[link]</a></span> . http://pastebin.com/QXa2i6qz

2 回答

  • 2

    以下代码可以从每个内容中提取所有youtube链接 .

    function extract_youtube_link($xml) {
        $entries = $xml['entry'];
        $videos = [];
        foreach($entries as $entry) {
            $content = html_entity_decode($entry['content']);
            preg_match_all('/<span><a href="(.*)">\[link\]/', $content, $matches);
            if(!empty($matches[1][0])) {
                $videos[] = array(
                    'entry_title' => $entry['title'],
                    'author' => preg_replace('/\/(.*)\//', '', $entry['author']['name']),
                    'author_reddit_url' => $entry['author']['uri'],
                    'video_url' => $matches[1][0]
                );
            }
        }
    
        return $videos;
    }
    
    $xml = simplexml_load_file('reddit.xml');
    $xml = json_decode(json_encode($xml), true);
    $videos = extract_youtube_link($xml);
    
    foreach($videos as $video) {
        echo "<p>Entry Title: {$video['entry_title']}</p>";
        echo "<p>Author: {$video['author']}</p>";
        echo "<p>Author URL: {$video['author_reddit_url']}</p>";
        echo "<p>Video URL: {$video['video_url']}</p>";
        echo "<br><br>";
    }
    

    具有内部元素的数组的多维格式的代码输出是 entry_titleauthorauthor_reddit_urlvideo_url . 希望它能帮到你!

  • 0

    如果你需要解析整个事情 . 一种方法是使用DOMXPath类并直接查询xml . 文档应该指导您完成 .

    http://php.net/manual/es/class.domxpath.php .

相关问题