如何在Google Refine中使用jython/python ElementTree解析xml

3 投票
3 回答
2090 浏览
提问于 2025-04-17 08:24

我正在尝试在 Google Refine 中使用 Jython 和 ElementTree 解析一些 XML,但我找不到任何能帮助我让这个工作正常的文档(可能是因为我不是 Python 程序员)

这是我正在尝试解析的 XML 的一部分。我想返回一个包含所有 dc:identifier 的连接字符串:

<oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
  <dc:creator>J. Koenig</dc:creator>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:identifier>CCTL0059</dc:identifier>
  <dc:identifier>CCTL0059</dc:identifier>
  <dc:identifier>http://open.jorum.ac.uk:80/xmlui/handle/123456789/335</dc:identifier>
  <dc:format>application/pdf</dc:format>
</oai_dc:dc>

这是我目前写的代码。这只是一个测试,看看能否返回任何东西,因为现在我得到的只是“错误:null”

from elementtree import ElementTree as ET
element = ET.parse(value)

namespace = "{http://www.openarchives.org/OAI/2.0/oai_dc/}"
e = element.findall('{0}identifier'.format(namespace))
for i in e:
   count += 1
return count

3 个回答

0

这是对J.F. Sebastian版本的一个小改动,可以直接粘贴到Google Refine中:

from xml.etree import ElementTree as ET
element = ET.fromstring(value)
namespace = "{http://purl.org/dc/elements/1.1/}"
return ','.join([e.text for e in element.getiterator(namespace+'identifier')])

它会返回一个用逗号分隔的列表,不过你可以在返回的语句中更改分隔符。

2

你用了错误的命名空间。这段代码在 Jython 2.5.1 上可以正常运行:

from xml.etree import ElementTree as ET
element = ET.fromstring(value) # `value` is a string with the xml from question

namespace = "{http://purl.org/dc/elements/1.1/}"
for e in element.getiterator(namespace+'identifier'):
    print e.text

输出结果

CCTL0059
CCTL0059
http://open.jorum.ac.uk:80/xmlui/handle/123456789/335
2

你可以使用这样的GREL表达式,试试看:

forEach(value.parseHtml().select("dc|identifier"),v,v.htmlText()).join(",")

对于找到的每一个标识符,给我它的html文本,并把它们用逗号连接起来。parseHtml()这个函数使用了Jsoup.org库,实际上就是用来解析标签和结构的。它还可以处理带有命名空间的格式,比如ns|identifier,这样在这种情况下获取你想要的内容会更方便。

撰写回答