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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

Q&A

解決済

1回答

2007閲覧

PythonでXMLをparseした際に一部要素が元のXMLと異なる内容に勝手に書き換わる現象を回避したい

living_on_ice

総合スコア6

XML

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

0グッド

0クリップ

投稿2020/02/10 10:45

編集2020/02/12 13:20

前提・実現したいこと

以下のXMLに含まれる「text」タグの中身をそのまま抜き出して変数に取得したいのですが、中身を取得したらXML上の文字列とは似つかない文字列に勝手に差し変わってしまいます。
「text」タグの中身をそのまま取得したいです。

xml

1<pages> 2 <page> 3 <title>アンパサンド</title> 4 <ns>0</ns> 5 <id>5</id> 6 <revision> 7 <id>73841108</id> 8 <parentid>73290874</parentid> 9 <timestamp>2019-08-14T00:23:07Z</timestamp> 10 <contributor> 11 <username>Ttle-recll</username> 12 <id>1525028</id> 13 </contributor> 14 <comment>/* 手書き */</comment> 15 <model>wikitext</model> 16 <format>text/x-wiki</format> 17 <text xml:space="preserve">{{Redirect|&amp;}} 18{{Otheruses|記号|競走馬|アンパサンド (競走馬)}} 19{{WikipediaPage|「アンパサンド (&)」の使用|WP:JPE#具体例による説明}} 20{{記号文字|&amp;amp;}} 21{{複数の問題|出典の明記=2018年10月8日 (月) 14:50 (UTC)|独自研究=2018年10月8日 (月) 14:50 (UTC)}} 22[[Image:Trebuchet MS ampersand.svg|right|thumb|100px|[[Trebuchet MS]] フォント]] 23'''アンパサンド''' ('''&amp;amp;'''、英語名:{{lang|en|ampersand}}) とは並立助詞「…と…」を意味する[[記号]]である。[[ラテン語]]の {{lang|la|&quot;et&quot;}} の[[合字]]で、[[Trebuchet MS]]フォントでは、[[ファイル:Trebuchet MS ampersand.svg|10px]]と表示され &quot;et&quot; の合字であることが容易にわかる。ampersa、すなわち &quot;and per se and&quot;、その意味は&quot;and [the symbol which] by itself [is] and&quot;である。 24 25== 歴史 == 26[[Image:Historical ampersand evolution.svg|thumb|right|390px|アンパサンドの進展]] 27その使用は1世紀に遡ることができ、5世紀中葉から現代に至るまでの変遷がわかる。 28[[Z]] に続く[[ラテン文字]][[アルファベット]]の27字目とされた時期もある。 29 30アンパサンドと同じ役割を果たす文字に「{{仮リンク|ティロ式記号|en|Tironian notes}}のet」と呼ばれる、数字の「7」に似た記号があった({{unicode|⁊}}, U+204A)。この記号は現在も[[ゲール文字]]で使われている。 31 32記号名の「アンパサンド」は、ラテン語まじりの英語「&amp;amp; はそれ自身 &quot;and&quot; を表す」(&amp;amp; per se and) のくずれた形である。英語以外の言語での名称は多様である。 33 34==手書き== 35[[File:Ampersand-handwriting-1.png|right|thumb|80px|手書きのアンパサンド]][[Image:Ampersand-handwriting-2.svg|right|thumb|80px|手書きのアンパサンド(簡素化)]] 36日常的な手書きの場合、[[欧米]]でアンパサンドは「'''ε'''」に縦線を引く単純化されたものが使われることがある。 37 38また同様に、「'''t'''」または「'''+'''(プラス)」に輪を重ねたような、[[無声歯茎側面摩擦音]]を示す[[発音記号]]「'''{{IPA|ɬ}}'''」のようなものが使われることもある。 39 40== プログラミング言語 == 41[[プログラミング言語]]では、[[C言語|C]] など多数の言語で AND [[演算子]]として用いられる。以下は C の例。 42* &lt;code&gt;X = A '''&amp;amp;&amp;amp;''' B&lt;/code&gt; のように2個重ねたものは[[論理積|論理 AND]] を表す。この場合 A, B がともに真ならば X も真、それ以外は偽である。 43* &lt;code&gt;0x12345678 '''&amp;amp;''' 0x0f0f0f0f&lt;/code&gt; のように1個であれば[[ビット演算#AND|ビット AND]] を表す。この場合の結果は &lt;code&gt;0x02040608&lt;/code&gt; である。 44[[PHP (プログラミング言語)|PHP]]では、変数宣言記号($)の直前に記述することで、[[参照渡し]]を行うことができる。 45 46[[BASIC]] 系列の言語では[[文字列]]の連結演算子として使用される。&lt;code&gt;&quot;foo&quot; '''&amp;amp;''' &quot;bar&quot;&lt;/code&gt;&lt;code&gt;&quot;foobar&quot;&lt;/code&gt; を返す。また、主に[[マイクロソフト]]系では整数の[[十六進法|十六進表記]]に '''&lt;code&gt;&amp;amp;h&lt;/code&gt;''' を用い、&lt;code&gt;&amp;amp;h0F&lt;/code&gt; (十進で15)のように表現する。 47 48[[Standard Generalized Markup Language|SGML]]、[[Extensible Markup Language|XML]]、[[HyperText Markup Language|HTML]]では、アンパサンドを使って[[SGML実体]]を参照する。 49 50== 符号位置 == 51{| class=&quot;wikitable&quot; style=&quot;text-align:center;&quot; 52!記号!![[Unicode]]!![[JIS X 0213]]!![[文字参照]]!!名称 53{{CharCode|38|0026|1-1-85|アンパサンド|amp}} 54{{CharCode|65286|ff06|1-1-85|アンパサンド(全角)}} 55|} 56 57== 外部リンク == 58{{Commons|Ampersand}} 59&lt;!-- 60== 脚注 == 61{{Reflist}} 62--&gt; 63{{punctuation marks|&amp;amp;}} 64{{DEFAULTSORT:あんはさんと}} 65[[Category:約物]] 66[[Category:ラテン語の語句]] 67[[Category:論理記号]]</text> 68 <sha1>kouc3jdgpxhfmpwjyzz53t9vo6s5rwq</sha1> 69 </revision> 70 </page> 71 <page> 72 <title>Wikipedia:Sandbox</title> 73 <ns>4</ns> 74 <id>6</id> 75 <redirect title="Wikipedia:サンドボックス" /> 76 <revision> 77 <id>70473293</id> 78 <parentid>70473279</parentid> 79 <timestamp>2018-10-31T16:40:16Z</timestamp> 80 <contributor> 81 <username>Y-dash</username> 82 <id>309126</id> 83 </contributor> 84 <minor /> 85 <comment>「[[Wikipedia:Sandbox]]」を保護しました: 編集不要のページ, 場所間違えの防止 ([編集=自動承認された利用者のみ許可] (無期限) [移動=自動承認された利用者のみ許可] (無期限))</comment> 86 <model>wikitext</model> 87 <format>text/x-wiki</format> 88 <text xml:space="preserve">#REDIRECT [[Wikipedia:サンドボックス]]</text> 89 <sha1>8x10n6namf7oawlowe0whbs04o55b8d</sha1> 90 </revision> 91 </page> 92</pages>

発生している問題

「text」タグの中身を取得すると、取得結果の中身がなぜか以下の内容になります。

#REDIRECT [[Wikipedia:サンドボックス]]

該当のソースコード

Python

1from xml.etree.ElementTree import iterparse 2 3input_path = './target.xml' 4 5context = iterparse(input_path, events=['start', 'end']) 6_, root = next(context) 7 8for (event, node) in context: 9 10 if event == 'start': 11 12 text = node.text 13 if text is None: 14 continue 15 16 if node.tag == 'title' or re.search('}title$', node.tag): 17 # 略 18 19 elif node.tag == 'text' or re.search('}text$', node.tag): 20 print(text) 21 # 略 22 23 else: 24 print(node.tag) 25 26 # 略

試したこと

同じソース内で取得している「title」タグの方は、中身を問題なく取得できています。

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

Pythonのバージョンは3.6.9で、実行環境はUbuntu18.04です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「text」タグの中身を取得すると、取得結果の中身がなぜか以下の内容になります。

XMLに、

plain

1 <text xml:space="preserve">#REDIRECT [[Wikipedia:サンドボックス]]</text>

と書いてありますけど。

そもそも、XMLデータにルート要素が2つあるので、このままだとエラーになると思いますが、エラーになってませんか?

投稿2020/02/10 17:44

otn

総合スコア85901

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

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

living_on_ice

2020/02/12 13:24

XMLの正しいルート要素が欠落していたので修正しました。 また、理由は見つけられていないのですがtextタグの中身が正しく取れるようになっていました。 色々申し訳ありません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問