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

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

ただいまの
回答率

88.61%

pythonでXMLのパースでkeyError: "="が出る

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 962

sera_sera

score 16

前提・実現したいこと

・ElementTreeを使って該当のXML文をパースし指定したタグで挟まれたテキストを抽出したいです。
・XMLファイルによってはsequence="1"~"6"まであります。

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

・XML文中に"="を含むとエラーをはきます。

Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\xml\etree\ElementPath.py", line 272, in iterfind
    selector = _cache[cache_key]
KeyError: ('.//parties/jp:applicants-agents-article/jp:applicants-agents sequence="1"/applicant sequence="1"/addressbook lang="ja"/name', (('jp', 'http://www.jpo.go.jp'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\T15015\PycharmProjects\PatentApp\patentApp\test_area.py", line 28, in <module>
    print("11-1.名前1::" + str(elem.findtext('.//parties/jp:applicants-agents-article/jp:applicants-agents sequence="1"/applicant sequence="1"/addressbook lang="ja"/name', namespaces={'jp':'http://www.jpo.go.jp'})))
  File "C:\Program Files\Python37\lib\xml\etree\ElementPath.py", line 320, in findtext
    elem = next(iterfind(elem, path, namespaces))
  File "C:\Program Files\Python37\lib\xml\etree\ElementPath.py", line 286, in iterfind
    selector.append(ops[token[0]](next, token))
KeyError: '='

該当のソースコード

# -*- coding: utf-8 -*-
import sys # sysモジュール読み込み
import glob # globモジュール読み込み
import os # osモジュール読み込み
import codecs # codecsモジュールの読み込み
from xml.etree.ElementTree import *
# sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

drive =  r"C:\Users\test"
os.chdir(drive) # 読み込み先に移動

x = 'test.xml'
tree = parse(x)
elem = tree.getroot()
print("11-1.名前1::" + str(elem.findtext('.//parties/jp:applicants-agents-article/jp:applicants-agents sequence="1"/applicant sequence="1"/addressbook lang="ja"/name', namespaces={'jp':'http://www.jpo.go.jp'})))
print("12-1.住所1::" + str(elem.findtext('.//parties/jp:applicants-agents-article/jp:applicants-agents sequence="1"/applicant sequence="1"/addressbook lang="ja"/address/text', namespaces={'jp':'http://www.jpo.go.jp'})))

該当のXMLファイル

<?xml-stylesheet type="text/xsl" href="../../../../../XSL/gat-a.xsl"?>

<!DOCTYPE jp-official-gazette PUBLIC "-//JPO//DTD PUBLISHED PATENT/UTILITY MODEL APPLICATION 1.0//EN" "../../../../../DTD/gat-a.dtd">

<jp-official-gazette kind-of-jp="A" kind-of-st16="A" lang="ja" dtd-version="1.0" country="JP" xmlns:jp="http://www.jpo.go.jp"><bibliographic-data lang="ja" country="JP">

    <publication-reference>

      <document-id>

        <country>JP</country>

        <doc-number>2017200451</doc-number>

        <kind>公開特許公報(A)</kind>

        <date>20171109</date>

      </document-id>

    </publication-reference>

    <application-reference>

      <document-id>

        <doc-number>2016093031</doc-number>

        <date>20160506</date>

      </document-id>

    </application-reference>

    <invention-title>飲料</invention-title>

    <parties>

      <jp:applicants-agents-article>

        <jp:applicants-agents sequence="1">

          <applicant sequence="1">

            <addressbook lang="ja">

              <name>株式会社パテント</name>

              <registered-number>000135324</registered-number>

              <address>

                <text>東京都</text>

              </address>

            </addressbook>

          </applicant>

        </jp:applicants-agents>

      </jp:applicants-agents-article>

      <inventors>

        <inventor sequence="1">

          <addressbook>

            <name>山田次郎</name>

            <address>

              <text>千葉県</text>

            </address>

          </addressbook>

        </inventor>

        <inventor sequence="2">

          <addressbook>

            <name>山田三郎</name>

            <address>

              <text>神奈川県</text>

            </address>

          </addressbook>

        </inventor>

      </inventors>

    </parties>

    <classification-ipc><edition/><main-clsf>A23L   2/00        20060101AFI20171013BHJP        </main-clsf><further-clsf>A23L   2/52        20060101ALI20171013BHJP        </further-clsf></classification-ipc>

    <classification-national><country>JP</country><main-clsf>A23L2/00 B</main-clsf><further-clsf>A23L2/00 F</further-clsf></classification-national>

    <number-of-claims jp:adopted-law="claim">1</number-of-claims>

    <jp:request-for-examination true-or-false="false"/>

    <jp:filing-form>OL</jp:filing-form>

    <jp:total-pages>6</jp:total-pages>

    <jp:theme-code-info>

      <jp:theme-code>4B117</jp:theme-code>

    </jp:theme-code-info>

    <jp:f-term-info>

      <jp:f-term>4B117LC03</jp:f-term>

      <jp:f-term>4B117LC04</jp:f-term>

      <jp:f-term>4B117LG11</jp:f-term>

      <jp:f-term>4B117LK08</jp:f-term>

      <jp:f-term>4B117LK11</jp:f-term>

      <jp:f-term>4B117LL02</jp:f-term>

    </jp:f-term-info>

  </bibliographic-data><jp:image-of-bibliographic-data><img id="000001" he="140" wi="160" file="2017200451.tif" img-format="tif" img-content="drawing"/></jp:image-of-bibliographic-data><description>

欲しい結果

11-1.名前1::株式会社パテント
12-1.住所1::天王洲アイル

試してみたこと

・"="を他文字に置換 → xml.etree.ElementTree.ParseError
・tree = parse(x)の後ろの行で"="を置換 → AttributeError: 'ElementTree' object has no attribute 'replace'

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

バージョン:Python3.7
開発環境:Atom1.31.2

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sera_sera

    2018/12/06 18:30

    このXMLファイル中に個人情報の入っているタグなのが含まれていた関係で一部を抜粋して質問欄に載せています。それのせいかもしれません。情報を修正しながら質問内容を書き換えてみます。

    キャンセル

  • Lhankor_Mhy

    2018/12/06 18:59

    あまり詳しくないので的外れだったら申し訳ないのですが、 xpath って 「jp:applicants-agents sequence="1"」のような表現が許されてるんでしたっけ? 属性って@で記述するのではないのですか?

    キャンセル

  • sera_sera

    2018/12/12 15:24

    返信遅れて申し訳ありません!
    当方XMLは初心者でして「属性」について初めて知りました。Lhankor_Mhyさんの助言を参考にいろいろと調べてみたところ解決することができました!検索条件の指定方法がいけなかったんですね。ありがとうございました!!

    キャンセル

回答 1

check解決した方法

+1

属性(sequence="1"など)は検索条件の中に入れることができないので、タグ名[@属性]の文法で指定する。

x = 'test.xml'
tree = parse(x)
elem = tree.getroot()
print("11-1.名前1::" + str(elem.findtext('.//parties/jp:applicants-agents-article/jp:applicants-agents[@sequence="1"]/applicant[@sequence="1"]/addressbook[@ lang="ja"]/name', namespaces={'jp':'http://www.jpo.go.jp'})))
print("12-1.住所1::" + str(elem.findtext('.//parties/jp:applicants-agents-article/jp:applicants-agents[@sequence="1"]/applicant[@sequence="1"]/addressbook[@ lang="ja"]/address/text', namespaces={'jp':'http://www.jpo.go.jp'})))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る