【问题标题】:Parsing HTML tags from inside XML in PHP在 PHP 中从 XML 内部解析 HTML 标签
【发布时间】:2013-07-07 05:26:03
【问题描述】:

我正在尝试使用simplexml_load_string 创建自己的RSS 提要(学习目的),同时在PHP 中解析http://uk.news.yahoo.com/rss。我在阅读 <description> 标记内的 HTML 标记时卡住了。

到目前为止,我的代码如下所示:

$feed = file_get_contents('http://uk.news.yahoo.com/rss');
$rss = simplexml_load_string($feed);

//for each element in the feed
foreach ($rss->channel->item as $item) {
    echo '<h3>'. $item->title . '</h3>'; 

        foreach($item->description as $desc){

             //how to read the href from the a tag???

             //this does not work at all
             $tags = $item->xpath('//a');
             foreach ($tags as $tag) {
                 echo $tag['href'];
             }
       }
}

任何想法如何提取每个 HTML 标记?

谢谢

【问题讨论】:

    标签: php xml-parsing simplexml


    【解决方案1】:

    这里最好的做法是在 $item 上使用 var_dump() 函数。

    feed = file_get_contents('http://uk.news.yahoo.com/rss');
    $rss = simplexml_load_string($feed);
    foreach ($rss->channel->item as $item) {
        var_dump($item);
        exit;
    }
    

    一旦你这样做了,你会看到你所追求的价值被称为“链接”。因此,要打印出 URL,您将使用以下代码:

    echo $item->link;
    

    【讨论】:

    • 但是,如果我只想获取提要的描述,这种方法是行不通的!因为我会得到描述标签中的所有东西(例如图片)
    • 啊,那是因为 RSS 中的实际“描述”元素包含一个图像。如果你只想要文本而不是图像,我会用 strip_tags 函数包装整个描述。因此,打印出 just 描述的代码将是: echo strip_tags($item->description);
    • 酷。这(如您所说)仅用于描述(为此感谢)。但是,如果我想提取所有元素及其属性?假设在这种情况下图像的src?或者图片的width?
    【解决方案2】:

    描述内容具有其特殊字符编码,因此它不被视为 XML 中的节点,而只是一个字符串。您可以解码特殊字符,然后将 HTML 加载到 DOMDocument 中并执行您想做的任何事情。例如:

    foreach ($rss->channel->item as $item) {
        echo '<h3>'. $item->title . '</h3>'; 
    
            foreach($item->description as $desc){
    
                $dom = new DOMDocument();
                $dom->loadHTML(htmlspecialchars_decode((string)$desc));
    
                $anchors = $dom->getElementsByTagName('a');
                echo $anchors->item(0)->getAttribute('href');
            }
    }
    

    XPath 也可用于 DOMDocument,请参阅 DOMXPath。

    【讨论】:

    • 谢谢。我发现我很接近但还不够接近。这正是我一直在寻找的。谢谢
    • 没问题,愉快的编码:)
    【解决方案3】:

    RSS 提要的&lt;description&gt; 元素包含 HTML。正如How to parse CDATA HTML-content of XML using SimpleXML? 中所述,您需要获取该元素(HTML)的节点值并在附加解析器中对其进行解析。

    accepted answer to the linked question 已经表明这一点非常冗长,对于 SimpleXML,无论该 RSS 提要使用 CDATA 还是仅像您的情况一样的实体,它在这里都不会发挥太大作用。

    $feed = file_get_contents('http://uk.news.yahoo.com/rss');
    $rss  = simplexml_load_string($feed);
    $dom  = new DOMDocument(); // the HTML parser used for descriptions' HTML
    
    foreach ($rss->channel->item as $item)
    {
        echo '<h3>' . $item->title . '</h3>', "\n";
    
        foreach ($item->description as $desc)
        {
            $dom->loadHTML($desc);
    
            $html = simplexml_import_dom($dom)->body;
    
            echo $html->p->a['href'], "\n";
        }
    }
    

    示例输出:

    ...
    <h3>Chantal nears hurricane strength in Caribbean</h3>
    http://uk.news.yahoo.com/chantal-nears-hurricane-strength-caribbean-220149771.html
    <h3>Placido Domingo In Hospital With Blood Clot</h3>
    http://uk.news.yahoo.com/placido-domingo-hospital-blood-clot-215427742.html
    <h3>Berlusconi's final tax fraud appeal hearing set for July 30</h3>
    http://uk.news.yahoo.com/berlusconis-final-tax-fraud-appeal-hearing-set-july-214714122.html
    <h3>China: Men Rescued From River Amid Floods</h3>
    http://uk.news.yahoo.com/china-men-rescued-river-amid-floods-213005159.html
    <h3>Snowden has not yet accepted asylum in Venezuela - WikiLeaks</h3>
    http://uk.news.yahoo.com/snowden-not-yet-accepted-asylum-venezuela-wikileaks-190332291.html
    <h3>Three US kidnap victims break silence</h3>
    http://uk.news.yahoo.com/three-us-kidnap-victims-release-thankyou-video-093832611.html
    ...
    

    希望这会有所帮助。与接受的答案相反,我认为没有理由申请htmlspecialchars_decode,实际上我很确定这会破坏事情。此外,我的示例还展示了如何在 HTML 被解析后通过展示如何将 DOMNode 转回 SimpleXMLElement 来停留在访问更多子项的 SimpleXML 方式中。

    【讨论】:

    • 嗨。谢谢你。我喜欢你的回答,因为它给了我 XML 节点。感谢您花时间写它。这两个答案都帮助我了解了如何访问这些标签(值信息)。再次感谢
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多