如何从RSS源中提取所有URL链接?

时间:2016-01-18 01:36:13

标签: php mysql regex xml rss

我需要定期从NY Times RSS feed提取所有新闻文章的链接到MySQL数据库。我该怎么做呢?我可以使用一些正则表达式(在PHP中)来匹配链接吗?还是有其他替代方式吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

更新2 我测试了以下代码,并且必须修改

strncpy

并将其更改为:

    $links = $dom->getElementsByTagName('a'); 

成功输出了链接。祝你好运

更新看起来这里有完整的答案:How do you parse and process HTML/XML in PHP

我开发了一个解决方案,以便我可以递归我网站中的所有链接。我删除了每个递归验证域名相同的代码(因为问题没有要求),但如果需要,可以轻松添加一个。

使用html5 DOMDocument,您可以解析HTML或XML文档以读取链接。它比使用正则表达式更好。试试这样的事情

    $links = $dom->getElementsByTagName('link');

答案 1 :(得分:1)

DOM + Xpath允许您使用表达式获取节点。

RSS项目链接

获取RSS链接元素(每个项目的链接):

$xml = file_get_contents($url);    
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXPath($document);

$expression = '//channel/item/link';

foreach ($xpath->evaluate($expression) as $link) {
  var_dump($link->textContent);
}

Atom Links

atom:link具有不同的语义,它们是Atom命名空间的一部分,用于描述关系。 NYT使用standout关系来标记特色故事。要获取Atom链接,您需要为命名空间注册前缀。属性也是节点,因此您可以直接获取它们:

$xml = file_get_contents($url);
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXPath($document);
$xpath->registerNamespace('a', 'http://www.w3.org/2005/Atom');

$expression = '//channel/item/a:link[@rel="standout"]/@href';

foreach ($xpath->evaluate($expression) as $link) {
  var_dump($link->value);
}

以下是other relations,例如prevnext

HTML链接(a元素)

description元素包含HTML片段。要从中提取链接,您必须将HTML加载到单独的DOM文档中。

$xml = file_get_contents($url);
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXPath($document);
$xpath->registerNamespace('a', 'http://www.w3.org/2005/Atom');

$expression = '//channel/item/description';

foreach ($xpath->evaluate($expression) as $description) {
  $fragment = new DOMDocument();
  $fragment->loadHtml($description->textContent);
  $fragmentXpath = new DOMXpath($fragment);
  foreach ($fragmentXpath->evaluate('//a[@href]/@href') as $link) {
    var_dump($link->value);
  } 
}