我想写一个脚本:
- 接受一些 RSS-Feed URL 作为输入
- 下载提要
- 删除标记不匹配某些正则表达式
<item> ...</item>
的所有匹配项。title
下面的例子应该说明这一点。假设我们有一个包含这三个项目的 RSS 提要:
- Project Foo - 让我们开始吧!
- 完全不同的东西
- Project Foo 的另一个更新
我只想保留标题中包含“Project Foo”的那些项目。
示例输入文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>My glorious newsfeed</title>
<description>...</description>
<link>...</link>
<language>...</language>
<pubDate>...</pubDate>
<item>
<title>Project Foo - Let's get started!</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Something else entirely</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Another update on Project Foo</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
</channel>
</rss>
示例输出文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>My glorious newsfeed</title>
<description>...</description>
<link>...</link>
<language>...</language>
<pubDate>...</pubDate>
<item>
<title>Project Foo - Let's get started!</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
<item>
<title>Another update on Project Foo</title>
<link>...</link>
<description>...</description>
<pubDate>...</pubDate>
</item>
</channel>
</rss>
如果可能的话,我想远离类似的东西,python
并使用命令行工具来做到这一点。但我是一个使用sed
等的大新手,需要一些帮助:)
这是我到目前为止所拥有的:
cat sample-feed.xml \
| tr -d '\n' \
| sed $'s/\<item\>/\\\n\<item\>/g;s/\<\/channel\><\/rss\>/\\\n\<\/channel\><\/rss\>/g' \
| sed '/^\<item\>/ d'
首先,我删除所有换行符。然后,我添加换行符以将每个换行符带到<item>...</item>
自己的行中。到目前为止的最后一个命令删除所有以 . 开头的行<item>
。为了
结果是一个没有任何项目的有效 rss-feed:
<?xml version="1.0" encoding="iso-8859-1"?><rss version="2.0"><channel><title>My glorious newsfeed</title><description>...</description><link>...</link><language>...</language><pubDate>...</pubDate>
</channel></rss>
为了使用 URL 而不是本地文件,我只需将其替换cat sample-feed.xml
为curl -s <some url>
.
但是仍然缺少的是对命令的修改sed '/^\<item\>/ d'
,它只删除以“Project Foo”开头<item>
但不包含“Project Foo”的行。
所以,如果你能帮我弄清楚最后一行应该说什么,我会很高兴。另一方面,我确信有一种更优雅的方法可以做到这一点。从我所见sed
,它非常强大,应该可以在一个sed
命令中执行此操作。
期待你的回答:-)
正如评论中所建议的那样,我尝试使用
xmlstarlet
它来解决这个问题并且效果很好。这是我的脚本假设提要内容在文件中
sample_rss.xml
。该内容被输入xml ed -d
,这将删除与给定 XPath 表达式匹配的任何注释。XPath 表达式查找任何<item>
不具有<title>
包含该文本的节点的节点"Project Foo"
。这似乎运作良好,我对执行时间也很满意:
小心命名空间
如果您想使用正确的 rss 或 atom 提要使其工作,您可能会注意到它
feed
包含一个 XML 命名空间 (xmlns
) 属性,就像 YouTube 中的这个示例一样:然后,上面的脚本将不再起作用!修复它让我很头疼,但这里是如何让它工作:
有关此命名空间问题的更多信息:http: //xmlstar.sourceforge.net/doc/UG/ch05.html