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

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

ただいまの
回答率

88.63%

PythonでElementTreeでXMLのテキストを抽出中にprefix mapエラーが出る

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 953

sera_sera

score 16

前提・実現したいこと

Pythonにて卒業研究のためのアプリを作っている初心者です。
XMLファイルからElementTreeモジュールを使って指定したタグのテキストを抽出したいです。
以下のコードでは本来ならば、

1.発行国 ::JP
2.公報種別::公開特許公報(A)
3.公開日 ::20171109
4.出願日 ::20160506
5.公開番号::2017200451
6.出願番号::2016093031
7.発明の名称::飲料
8.IPC分類::A23L   2/00        20060101AFI20171013BHJP        
9.請求項の数::1
10.全頁数::6


と表示されて欲しいです。

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

1.発行国 ::JP
Traceback (most recent call last):
  File "C:\Users\T15015\PycharmProjects\PatentApp\patentApp\test_area.py", line 31, in <module>
    print("10.全頁数 ::" + str(elem.findtext('.//jp:total-pages'))) # 全頁数
  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))
  File "C:\Program Files\Python37\lib\xml\etree\ElementPath.py", line 118, in prepare_descendant
    token = next()
2.公報種別::公開特許公報(A)
3.公開日 ::20171109
4.出願日 ::20160506
5.公開番号::2017200451
6.出願番号::2016093031
7.発明の名称::飲料
8.IPC分類::A23L   2/00        20060101AFI20171013BHJP        
9.請求項の数::1
  File "C:\Program Files\Python37\lib\xml\etree\ElementPath.py", line 83, in xpath_tokenizer
    raise SyntaxError("prefix %r not found in prefix map" % prefix) from None
SyntaxError: prefix 'jp' not found in prefix map

該当のソースコード

x = '2017200451.xml'
tree = parse(x)
elem = tree.getroot()
print("1.発行国 ::" + str(elem.findtext('.//publication-reference/document-id/country'))) # 発行国
print("2.公報種別::" + str(elem.findtext('.//publication-reference/document-id/kind'))) # 公報種別
print("3.公開日 ::" + str(elem.findtext('.//publication-reference/document-id/date'))) # 公開日
print("4.出願日 ::" + str(elem.findtext('.//application-reference/document-id/date'))) # 出願日
print("5.公開番号::" + str(elem.findtext('.//publication-reference/document-id/doc-number'))) # 公開番号
print("6.出願番号::" + str(elem.findtext('.//application-reference/document-id/doc-number'))) # 出願番号
print("7.発明の名称::" + str(elem.findtext('.//invention-title'))) # 発明の名称
print("8.IPC分類::" + str(elem.findtext('.//classification-ipc/main-clsf'))) # 国際特許分類(IPC)
print("9.請求項の数::" + str(elem.findtext('.//number-of-claims'))) # 請求項の数
print("10.全頁数 ::" + str(elem.findtext('.//jp:total-pages'))) # 全頁数

該当の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>株式会社Patent</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]を他の単語に置き換える
→「jp」を「jj」にreplaceで置換……エラーコード同じで「jp」が「jj」に変わっただけ

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

実際に試したわけではありません。
ちょっとドキュメントを読んだだけですので、確認はご自身でお願いします。

とりあえず、下記のマニュアルを読んでください。

上記の説明からすると、

# XML内で「xmlns:jp="http://www.jpo.go.jp"」と指定されているので、そのネームスペースを指定
print("10.全頁数 ::" + str(elem.findtext('.//jp:total-pages', namespaces={'jp': 'http://www.jpo.go.jp'}))) # 全頁数

でいけそうな気がします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/06 13:22

    ありがとうございます!
    解決しました!!

    キャンセル

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

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

関連した質問

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