用python解析Solr输出

用python解析Solr输出,python,parsing,solr,xml-parsing,beautifulsoup,Python,Parsing,Solr,Xml Parsing,Beautifulsoup,我正在尝试解析以下表单的solr输出: <doc> <str name="source">source:A</str> <str name="url">URL:A</str> <date name="p_date">2012-09-08T10:02:01Z</date> </doc> <doc> <str name="source">source:B</str> &

我正在尝试解析以下表单的solr输出:

<doc>
<str name="source">source:A</str>
<str name="url">URL:A</str>
<date name="p_date">2012-09-08T10:02:01Z</date>
</doc>
<doc>
<str name="source">source:B</str>
<str name="url">URL:B</str>
<date name="p_date">2012-08-08T11:02:01Z</date>
</doc>
我确实感觉到,我可以通过我的方式强行获得输出(比如说再次“喝汤”),但我希望有一个有效的解决方案来提取数据。 我需要的输出是:

source:A
URL:A
2012-09-08T10:02:01Z
source:B
URL:B
2012-08-08T11:02:01Z

谢谢

使用XML解析器代替任务;包含在Python中:

from xml.etree import ElementTree as ET

# `ET.fromstring()` expects a string containing XML to parse.
# tree = ET.fromstring(solrdata)  
# Use `ET.parse()` for a filename or open file object, such as returned by urllib2:
ET.parse(urllib2.urlopen(url))

for doc in tree.findall('.//doc'):
    for elem in doc:
        print elem.attrib['name'], elem.text

对任务使用XML解析器;包含在Python中:

from xml.etree import ElementTree as ET

# `ET.fromstring()` expects a string containing XML to parse.
# tree = ET.fromstring(solrdata)  
# Use `ET.parse()` for a filename or open file object, such as returned by urllib2:
ET.parse(urllib2.urlopen(url))

for doc in tree.findall('.//doc'):
    for elem in doc:
        print elem.attrib['name'], elem.text

您必须使用这种特定的输出格式吗?Solr支持开箱即用的Python输出格式(至少在版本4中),只需在查询中使用wt=Python即可。

您必须使用这种特定的输出格式吗?Solr支持开箱即用的Python输出格式(至少在版本4中),只需在查询中使用wt=Python。

renderContents()只需将每个子树转换为HTML即可。为什么不遍历所有src节点并输出它们的text属性呢?renderContents()只是将每个子树转换为HTML。为什么不迭代所有src节点并输出它们的text属性呢?考虑到它包含在Python中,这是个不错的主意。我尝试了这段代码(只有solr数据被检索到的xml替换),得到了以下结果:回溯(最后一次调用):文件“test.py”,第7行,在tree=ET.parse(f.read())文件“/usr/local/lib/python2.6/xml/etree/ElementTree.py”,第862行,在parse tree.parse(source,parser)文件中“/usr/local/lib/python2.6/xml/etree/ElementTree.py”,第579行,在parse source=open(source,“rb”)中缺少实际错误。
parse()
需要一个文件名或打开的文件对象。如果字符串中有数据,请使用
fromstring()
。哦,对不起,错误是IOError:[Errno 2]没有这样的文件或目录:我不知道为什么会出现这种情况。我正在使用urllib2查询solr,并在浏览器视图中获取整个xml。即使print f.read()也会打印xml,知道为什么会出现这种错误吗???@AjayNair:当使用
urllib2
时,不要对结果调用
read()
,只要传递响应即可(这是一个类似文件的对象)到
parse
resp=urllib2.urlopen(url)
然后
tree=ET.parse(resp)
。完全按照建议尝试,编译很好,但无法打印任何内容:print tree.getroot().tree中doc的标记。findall('doc'):print“HERE”“对于doc中的elem:print elem.attrib['name'],elem.text这里不打印,但是它打印根标记,考虑到它包含在Python中,这不是一个坏主意。我尝试了代码(仅更改是用检索到的xml替换solr数据),得到了以下结果:回溯(最后一次调用):文件“test.py”,第7行,在tree=ET.parse(f.read())文件“/usr/local/lib/python2.6/xml/etree/ElementTree.py”中,第862行,在parse tree.parse(source,parser)文件“/usr/local/lib/python2.6/xml/etree/ElementTree.py”中,第579行,在parse source=open(source,“rb”)中缺少实际的错误。
parse()
需要一个文件名或打开的文件对象。如果您有字符串中的数据,请使用
fromstring()
。哦,对不起。错误是IOError:[Errno 2]没有这样的文件或目录:我不确定为什么会出现这种情况。我正在使用urllib2查询solr,并在浏览器视图中获取整个xml。甚至打印f.read()打印xml,知道为什么会出现此错误吗?@AjayNair:当使用
urllib2
时,不要对结果调用
read()
,只需将响应(类似文件的对象)传递给
parse
resp=urllib2.urlopen(url)
然后
tree=ET.parse(resp)
。完全按照建议进行了尝试,编译很好,但无法打印任何内容:print tree.getroot().tree.findall('doc')中文档的标记:为文档中的元素打印“HERE”:print elem.attrib['name'],elem.text此处不打印,但它打印根标记fineWow不知道!我的解析器已经围绕Beautiful soup运行,但我将此用于未来!!谢谢您不知道!我的解析器已经围绕Beautiful soup运行,但我将此用于未来!!谢谢