如何解析从grep生成的文件中获取的数据?

时间:2018-02-21 11:20:17

标签: python xml parsing grep

我使用“grep”从巨大的XML文件中获取一些数据。这是文件的一部分:

    <title>Hlavní strana</title>
    <ns>0</ns>
--
    <title>Nápověda:Jak vytvořit článek</title>
    <ns>12</ns>
--
    <title>Nápověda:Editace stránky podrobně</title>
    <ns>12</ns>
--
    <title>Astronomie</title>
    <ns>0</ns>
--
    <title>Biologie</title>
    <ns>0</ns>

现在我需要提取“ns”属性为0的“title”括号之间的所有内容。我尝试使用正则表达式,但它不起作用。我真的不知道如何解析像这样的文件只能得到我想要的。任何建议都非常感谢!

3 个答案:

答案 0 :(得分:1)

最好在原始xml上使用 XML parser 来获取所需信息。但是要回答你的问题,下面的代码片段可能有所帮助。

<强>演示

s = """    <title>Hlavní strana</title>
    <ns>0</ns>
--
    <title>Nápověda:Jak vytvořit článek</title>
    <ns>12</ns>
--
    <title>Nápověda:Editace stránky podrobně</title>
    <ns>12</ns>
--
    <title>Astronomie</title>
    <ns>0</ns>
--
    <title>Biologie</title>
    <ns>0</ns>"""


import re
pattern = r"<title>(.*?)</title>\s+<ns>0</ns>"
print re.findall(pattern, s)

<强>输出:

['Hlavn\xc3\xad strana', 'Astronomie', 'Biologie']

答案 1 :(得分:1)

我不确定你做了什么,但正则表达似乎对我很有用:

import re

for title in re.finditer(r'<title>(.*?)</title>', data):
    print title.group(1)

但朋友不要让朋友用正则表达式解析XML类型的文档,因为你可能会遇到嵌套项目和转义的可怕困难。使用专用解析器会更好。

由于您已经将XML转换为不再是XML的东西,我们必须使用容忍错误的东西。 HTML解析器非常适合这个,我们可以使用一个名为BeautifulSoup的方法来实现它:

from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')

for title in soup.find_all('title'):
    print title.contents[0]

答案 2 :(得分:0)

我建议在原始数据上使用正确的xml解析器。

但是,我想提醒你注意awk作为一个grep-output解析器。如果将记录分隔符(RS)设置为--\n,则可以将每个匹配视为记录。这是一个适用于您的示例数据的脚本:

awk -v RS='--\n' '/<ns>0<\/ns>/ { gsub(".*<title>|</title>.*", ""); print }'

输出:

Hlavní strana
Astronomie
Biologie