0

抱歉,如果以前有人问过这个问题,但我在任何地方都找不到答案..

我正在尝试使用正则表达式来提取元素值,但被拉出的 xml 包含一个空行,这似乎会导致错误。

这是 XML 中的元素之一:

<entry>
    <id>http://feeds.rasset.ie/rteavgen/player/videos/show/?id=10103822</id>
    <showid>10103822</showid>
    <platform>iptv</platform>
    <published>2013-01-19T21:45:00+00:00</published>
    <updated>2013-01-19T23:41:00+00:00</updated>
    <title type="text">The Saturday Night Show</title>
    <content type="text">Chat show, presented by journalist and broadcaster Brendan O'Connor, featuring comedy, celebrity guests and live musical performances.</content>
    <category term="RTÉ One" rte:type="channel"/>
    <category term="Entertainment" rte:type="genre"/>
    <category term="None" rte:type="series"/>
    <category term="None" rte:type="episode"/>
    <category term="None" rte:type="ranking"/>
    <category term="1024" rte:type="genrelist"/>
    <category term="None" rte:type="keywordlist"/>
    <category term="1668" rte:type="progid"/>
    <link rel="self" type="application/atom+xml" href="http://feeds.rasset.ie/rteavgen/player/playlist?showId=10103822"/>

    <link rel="alternate" type="text/html" href="http://www.rte.ie/player/#v=10103822"/>
    <rte:valid start="2013-01-19T21:52:12+00:00" end="2013-02-09T21:52:12+00:00"/>
    <rte:duration ms="4201061" formatted="1:10"/>
    <rte:statistics views="194"/>
    <media:title type="plain">The Saturday Night Show</media:title>
    <media:description type="plain">Chat show, presented by journalist and broadcaster Brendan O'Connor, featuring comedy, celebrity guests and live musical performances.</media:description>
    <media:player url="http://feeds.rasset.ie/rteavgen/player/player/?id=" width="400" height="300"/>
    <media:thumbnail url="http://img.rasset.ie/0006e56a.jpg" time="00:00:00+00:00"/>
    <media:restriction relationship="allow" type="country"/>
    <media:restriction relationship="disallow" type="country"/>
    <media:copyright>RTÉ</media:copyright>
</entry>

您可以看到两个“link rel=”元素之间有一个空行。

当我尝试使用这个正则表达式命令时,它会抛出超时!错误,因为我没有正确处理这个问题(请原谅我的正则表达式知识几乎为零)。

links = (re.compile ('<showid>(.+?)</showid>\n        ' \
                         '<platform>.+?</platform>\n        ' \
                         '<published>(.+?)</published>\n        ' \
                         '<updated>.+?</updated>\n        ' \
                         '<title type="text">(.+?)</title>\n        ' \
                         '<content type="text">(.+?)</content>\n        ' \
                         '<category term="(.+?)" rte:type="channel"/>\n        ' \
                         '<category term=".+?" rte:type="genre"/>\n        ' \
                         '<category term=".+?" rte:type="series"/>\n        ' \
                         '<category term=".+?" rte:type="episode"/>\n        ' \
                         '<category term=".+?" rte:type="ranking"/>\n        ' \
                         '<category term=".+?" rte:type="genrelist"/>\n        ' \
                         '<category term=".+?" rte:type="keywordlist"/>\n        ' \
                         '<category term=".+?" rte:type="progid"/>\n        ' \
                         '<link rel="self" type=".+?" href=".+?" />\n        ' \
                         '<link rel="alternate" type=".+?" href=".+?" />').findall(data))

我实际上只想要几个字段,但我似乎找不到允许我选择我想要的单个元素名称的正则表达式命令,它让我按顺序输入每个字段(同样,我缺乏正则表达式知识是问题)。除了我需要的第二个“link rel =”元素之外,我还需要一些字段,但是由于它不断地落在这个元素上,所以我暂时将它们排除在外。

任何人都知道我需要什么正则表达式命令来跳过空白行,也许还需要整理表达式以仅提取我需要的元素?

谢谢各位帮忙,希望...

4

2 回答 2

2

要删除空行,您不需要正则表达式:

with open("my_file.xml") as xmlfile:
    lines = [line for line in xmlfile if line.strip() is not ""]

with open("my_file.xml", "w") as xmlfile:
    xmlfile.writelines(lines)

同样要解析xml文件,您可以简单地使用 expat:http ://docs.python.org/2/library/pyexpat.html甚至可能是迷你 dom:http://docs.python.org/2/library/xml。 dom.minidom.html另一个非常好的方法是 ElementTree:http ://docs.python.org/2/library/xml.etree.elementtree.html

但是,不建议使用正则表达式,这实际上是一个坏主意。

于 2013-01-20T18:50:18.543 回答
0

正如其他人所说,您不应该为此任务使用正则表达式。

回答您的实际问题:您对元素之间的空白过于具体。在这种情况下,是额外的空格导致您出现问题。它可能很容易没有空格:

<category term="None" rte:type="ranking"/><category term="1024" rte:type="genrelist"/>

解决方法:不要使用\n后跟 8 个空格,而是使用\s*(零个或多个空格字符)。

于 2013-01-20T20:27:33.573 回答