【问题标题】:Parse Solr output in python在 python 中解析 Solr 输出
【发布时间】:2013-01-21 18:24:45
【问题描述】:

我正在尝试解析表单的 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>

我热衷于使用漂亮的汤(具有 BeautifulStoneSoup 的版本;我认为在 BS4 之前)来解析文档。 我使用了漂亮的汤来进行 HTML 解析,但有些我无法找到一种有效的方法来提取标签的内容。

我写过:

for tags in soup('doc'):
    print tags.renderContents()

我确实感觉到我可以强制通过它来获得输出(比如再次说“汤”),但我希望有一个有效的解决方案来提取数据。 我需要的输出是:

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

谢谢

【问题讨论】:

  • renderContents() 只是将每个子树转换为 HTML。为什么不遍历所有 src 节点并输出它们的 text 属性?

标签: python parsing solr xml-parsing beautifulsoup


【解决方案1】:

使用 XML 解析器代替任务; xml.etree.ElementTree 包含在 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

【讨论】:

  • 不错的主意,考虑到它包含在 Python 中。我尝试了代码(只有将 solr 数据替换为检索到的 xml 的变化),我得到以下信息: Traceback(最近一次调用最后一次):文件“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 行,解析中 source = open(source, "rb")
  • 那里缺少实际错误。parse() 需要一个文件名或打开的文件对象。如果您有字符串中的数据,请使用fromstring()
  • 对不起。错误是 IOError: [Errno 2] No such file or directory: 我不知道为什么会这样。我正在使用 urllib2 查询 solr,并在浏览器视图中获取整个 xml。甚至 print f.read() 也会打印出 xml,知道为什么会出现这个错误吗??
  • @AjayNair: 使用urllib2时,在结果上调用read(),只需将响应(这是一个类似文件的对象)传递给@987654328 @:resp = urllib2.urlopen(url) 然后tree = ET.parse(resp)
  • 完全按照建议进行了尝试,编译正常但无法打印任何内容: print tree.getroot().tag for doc in tree.findall('doc'): print "HERE" for elem in doc: print elem.attrib['name'], elem.text 这里不打印,但是打印根标签很好
【解决方案2】:

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

【讨论】:

  • 哇不知道!我的解析器已经围绕着美丽的汤,但我将来会使用它!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多