1

私はPythonとSOの比較的初心者です。情報を抽出する必要がある xml ファイルがあります。これに数日間苦労しましたが、ようやく情報を適切に抽出するものを見つけたと思います。今、正しい出力を得るのに苦労しています。これが私のコードです:

from xml import etree
node = etree.fromstring('<dataObject><identifier>5e1882d882ec530069d6d29e28944396</identifier><description>This is a paragraph about a shark.</description></dataObject>')
identifier = node.findtext('identifier')
description = node.findtext('description')
print identifier, description

私が得た結果は、「5e1882d882ec530069d6d29e28944396 これはサメについての段落です。」であり、これが私が望むものです。

ただし、本当に必要なのは、文字列ではなくファイルから読み取ることができることです。だから私はこのコードを試します:

from xml import etree
node = etree.parse('test3.xml')
identifier = node.findtext('identifier')
description = node.findtext('description')
print identifier, description

今、私の結果は「なしなし」です。ファイルを正しく取得していないか、出力に問題があると感じています。これがtest3.xmlの内容です

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response xmlns="http://www.eol.org/transfer/content/0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dwc="http://rs.tdwg.org/dwc/dwcore/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:dwct="http://rs.tdwg.org/dwc/terms/" xsi:schemaLocation="http://www.eol.org/transfer/content/0.3 http://services.eol.org/schema/content_0_3.xsd">
  <identifier>5e1882d822ec530069d6d29e28944369</identifier>
  <description>This is a paragraph about a shark.</description>

4

2 に答える 2

1

XML ファイルはデフォルトの名前空間を使用します。正しい名前空間で検索を修飾する必要があります。

identifier = node.findtext('{http://www.eol.org/transfer/content/0.3}identifier')

ElementTree が正しい要素に一致するようにします。

およびメソッドに明示.find()的なネームスペース ディクショナリを指定することもできます。これはあまり文書化されていません:findall()iterfind()

namespaces = {'eol': 'http://www.eol.org/transfer/content/0.3'} # add more as needed

root.findall('eol:identifier', namespaces=namespaces)

プレフィックスは、渡したパラメーターでのみ検索されnamespacesます。これは、任意の名前空間プレフィックスを使用できることを意味します。API はその部分を分割し、辞書でeol:対応する名前空間の URL を検索してから、代わりに XPath 式を検索するように検索を変更します。namespaces{http://www.eol.org/transfer/content/0.3}identifier

lxmlライブラリに切り替えることができれば、状況は良くなります。そのライブラリは同じ ElementTree API をサポートしますが、.nsmap要素の属性で名前空間を収集します。

于 2013-03-12T15:17:30.307 に答える
0

あなたはpythonであなたのxmlを解析するためにbeautifulsoupを試すことを考えましたか?

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Parsing%20XML

いくつかの優れたドキュメントと健全なオンライングループがあるので、サポートは非​​常に優れています

A

于 2013-03-12T15:21:12.927 に答える