我正在搜索一个看起来像这样的 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/

10-12 22:19