我使用“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”括号之间的所有内容。我尝试使用正则表达式,但它不起作用。我真的不知道如何解析像这样的文件只能得到我想要的。任何建议都非常感谢!
答案 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