我正在搜索一个看起来像这样的 OPML 文件。我想拉出大纲文本和 xmlUrl。
<outline text="lol">
<outline text="Discourse on the Otter" xmlUrl="http://discourseontheotter.tumblr.com/rss" htmlUrl="http://discourseontheotter.tumblr.com/"/>
<outline text="fedoras of okc" xmlUrl="http://fedorasofokc.tumblr.com/rss" htmlUrl="http://fedorasofokc.tumblr.com/"/>
</outline>
我的功能:
import re
rssName = 'outline text="(.*?)"'
rssUrl = 'xmlUrl="(.*?)"'
def rssSearch():
doc = open('ttrss.txt')
for line in doc:
if "xmlUrl" in line:
mName = re.search(rssName, line)
mUrl = re.search(rssUrl, line)
if mName is not None:
print mName.group()
print mUrl.group()
但是,返回值显示为:
outline text="fedoras of okc"
xmlUrl="http://fedorasofokc.tumblr.com/rss"
rssName 和 rssUrl 的正确正则表达式是什么,以便我只返回引号之间的字符串?
最佳答案
不要使用正则表达式来解析 XML。代码很乱,可能出错的地方太多了。
例如,如果您的 OPML 提供程序碰巧像这样重新格式化他们的输出怎么办:
<outline text="lol">
<outline
htmlUrl="http://discourseontheotter.tumblr.com/"
xmlUrl="http://discourseontheotter.tumblr.com/rss"
text="Discourse on the Otter"
/>
<outline
htmlUrl="http://fedorasofokc.tumblr.com/"
xmlUrl="http://fedorasofokc.tumblr.com/rss"
text="fedoras of okc"
/>
</outline>
这是完全有效的,它的意思完全相同。但是面向行的搜索和像
'outline text="(.*?)"'
这样的正则表达式会崩溃。相反,使用 XML 解析器。您的代码将更干净、更简单、更可靠:
import xml.etree.cElementTree as ET
root = ET.parse('ttrss.txt').getroot()
for outline in root.iter('outline'):
text = outline.get('text')
xmlUrl = outline.get('xmlUrl')
if text and xmlUrl:
print text
print xmlUrl
这可以处理您的 OPML 片段和我在网上找到的类似 OPML 文件,例如 political science list 。它非常简单,没有什么棘手的。 (我不是吹牛,这只是使用 XML 解析器而不是正则表达式的好处。)
关于python - 如何使用正则表达式在 OPML (XML) 文件中查找引用的属性值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16201513/