質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1029閲覧

Pythonでxmlファイルの要素数を算出

rr112527

総合スコア8

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/19 19:41

前提・実現したいこと

Pythonでxmlファイルの要素数を算出したいです.

発生している問題・エラーメッセージ

論文データベースのxmlに,何件論文があるか調べたいのですが,
ネットで調べてあるコードを参考にしてみたところ以下のようなエラーが出ました.
どのように対処すればエラーが出ず論文数を算出できるでしょうか?

Traceback (most recent call last):

File "C:\Users\rr112\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)

File "<ipython-input-3-7862886a7fd8>", line 1, in <module>
tree = parse("dblp.xml")

File "C:\Users\rr112\Anaconda3\lib\xml\etree\ElementTree.py", line 1196, in parse
tree.parse(source, parser)

File "C:\Users\rr112\Anaconda3\lib\xml\etree\ElementTree.py", line 597, in parse
self._root = parser._parse_whole(source)

File "<string>", line unknown
ParseError: undefined entity ö: line 43, column 18

該当のソースコード

from xml.etree.ElementTree import *
tree = parse("dblp.xml")
elem = tree.getroot()

試したこと

補足情報(FW/ツールのバージョンなど)

初心者なので分かりやすく説明して頂けるとありがたいです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

元データがhttp://dblp.org/xml/だとすると&ouml;というウムラウト付きのOの文字参照が含まれており、それをparserが解釈できないために発生しています。
ちなみにchromeなどのブラウザで開こうとしても同様エラーが発生します。

解決策としては、DTDで検証することで読み込めるようになります。
参考:lxml xmlsyntaxerror: entity 'ouml' not defined

Python

1from lxml import etree as ET 2parser = ET.XMLParser(dtd_validation=True) # DTDを利用。.xml内に記載されているdblp.dtdが利用される 3tree = ET.parse('dblp_test.xml', parser) 4root = tree.getroot() 5with open('ret.txt', 'w', encoding='utf-8') as f: 6 for art in root.findall('article'): 7 f.write( 'title[{}]\n'.format( art.find('title').text)) 8 for aut in art.findall('author'): 9 f.write( 'author[{}]\n'.format(aut.text)) 10 f.write( '\n')

.xmlと同じ場所に公開されているdblp.dtdをダウンロードし、.xmlファイルと同じディレクトリに配置しておいてください。

dblp_test.xml

PlainText

1<?xml version="1.0" encoding="ISO-8859-1"?> 2<!DOCTYPE dblp SYSTEM "dblp.dtd"> 3<dblp> 4<article mdate="2017-05-28" key="journals/acta/Schonhage77"> 5<author>Arnold Sch&ouml;nhage</author> 6<title>Schnelle Multiplikation von Polynomen &uuml;ber K&ouml;rpern der Charakteristik 2.</title> 7<journal>Acta Inf.</journal> 8<volume>7</volume> 9<year>1977</year> 10<pages>395-398</pages> 11<url>db/journals/acta/acta7.html#Schonhage77</url> 12<ee>https://doi.org/10.1007/BF00289470</ee> 13</article> 14<article mdate="2017-05-28" key="journals/acta/BozapalidisFR12"> 15<author>Symeon Bozapalidis</author> 16<author>Zolt&aacute;n F&uuml;l&ouml;p 0001</author> 17<author>George Rahonis</author> 18<title>Equational weighted tree transformations.</title> 19<pages>29-52</pages> 20<year>2012</year> 21<volume>49</volume> 22<journal>Acta Inf.</journal> 23</article> 24</dblp>

ret.txt

PlainText

1title[Schnelle Multiplikation von Polynomen über Körpern der Charakteristik 2.] 2author[Arnold Schönhage] 3 4title[Equational weighted tree transformations.] 5author[Symeon Bozapalidis] 6author[Zoltán Fülöp 0001] 7author[George Rahonis]

投稿2018/06/20 01:44

can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rr112527

2018/06/20 13:06

分かりやすい説明ありがとうございます!!おかげさまで助かりました,卒業研究関係のため素早い回答とてもありがたかったです!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問