🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

2638閲覧

PythonでXMLのパースを行いたい

Taka787

総合スコア23

Python 3.x

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

0グッド

1クリップ

投稿2019/11/25 06:05

以下のXMLファイルからタグ名「gml:posList」の情報だけを標準出力表示させたいです。
ゆくゆくは、位置座標データのみをCSVで出力を考えています。
取り敢えず、標準出力を行いたいですが、うまくいきません
どなたかご教示お願い致します。
pythonコードは以下です。

python

1# coding: utf-8 2from bs4 import BeautifulSoup 3import csv 4import pandas as pd 5import os 6 7xml = open("A31-12_13.xml", "r", encoding="utf-8").read() 8soup = BeautifulSoup(xml, 'lxml-xml') 9 10info = {} 11data = soup.find_all("gml:posList") 12print(data)

試したこと

find_allで指定すると、膨大な量になるから、メモリエラー等で何も表示されないのかと思い、findで指定してみましたが、結果はNoneでした。

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<ksj:Dataset gml:id="A31Dataset" xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app KsjAppSchema-A31.xsd"> 3<gml:description>国土数値情報 浸水想定区域 インスタンス文書</gml:description> 4<!-- データ提供範囲 --> 5<gml:boundedBy> 6 <gml:EnvelopeWithTimePeriod srsName="JGD2000 / (B, L)" frame="GC / JST"> 7 <gml:lowerCorner>20.0 123.0</gml:lowerCorner> 8 <gml:upperCorner>46.0 154.0</gml:upperCorner> 9 <gml:beginPosition calendarEraName="西暦">1900</gml:beginPosition> 10 <gml:endPosition indeterminatePosition="unknown"/> 11 </gml:EnvelopeWithTimePeriod> 12</gml:boundedBy> 13<gml:Curve gml:id="c00001"> 14 <gml:segments> 15 <gml:LineStringSegment> 16 <gml:posList> 1735.817677 139.767502 1835.817654 139.767160 1935.817635 139.767028 2035.817580 139.766645 2135.817475 139.766214 2235.817265 139.765878 2335.816824 139.765594 2435.816578 139.765308 2535.816492 139.765208 2635.816435 139.765142 2735.816361 139.765211 2835.816338 139.765231 2935.816223 139.765338 3035.815745 139.765779 3135.815693 139.765699 3235.815020 139.766155 3335.814327 139.765866 3435.813789 139.766001 3535.813731 139.767758 3635.814411 139.767795 3735.815425 139.767733 3835.815438 139.768314 3935.815339 139.768599 4035.815413 139.769020 4135.815673 139.769181 4235.815487 139.769552 4335.814745 139.770431 4435.815017 139.770530 4535.816101 139.770586 4635.816044 139.770143 4735.816024 139.769277 4835.816093 139.768886 4935.815850 139.768255 5035.815754 139.767677 5135.815600 139.767350 5235.815369 139.766599 5335.815888 139.766445 5435.816850 139.765963 5535.817292 139.766425 5635.817254 139.767157 5735.817372 139.767640 5835.817677 139.767502 59 </gml:posList> 60 </gml:LineStringSegment> 61 </gml:segments> 62</gml:Curve> 63<gml:Surface gml:id="a00001"> 64 <gml:patches> 65 <gml:PolygonPatch> 66 <gml:exterior> 67 <gml:Ring> 68 <gml:curveMember xlink:href="#c00001"/> 69 </gml:Ring> 70 </gml:exterior> 71 </gml:PolygonPatch> 72 </gml:patches> 73</gml:Surface>

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

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

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

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

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

TaniguchiTakaki

2019/11/25 07:34

うまくいきませんではなくてどういう表示になるんですか?想定したものはなんですか?
tiitoi

2019/11/25 07:59

こちらの環境では指定した要素の中身が出力されました。 print(soup) で XML の中身が表示されますか ファイルパスがまちがっていないか確認してください
Taka787

2019/11/25 09:04

皆さん、ありがとうございました。無事解決できました。
guest

回答2

0

これとIdも順に抽出したければ、どうすればいいんですか。

投稿2022/06/02 06:12

N1ko

総合スコア4

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

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

0

自己解決

以下のコードで解決できました。ありがとうございました。

python

1# coding: utf-8 2from bs4 import BeautifulSoup 3import csv 4import pandas as pd 5import os 6 7with open('A31-12_13.xml', 'r', encoding='utf-8') as file: 8 read = file.read() 9soup = BeautifulSoup(read, "lxml-xml") 10position = soup.find_all("posList") 11position = str(position) 12position_split = position.split('\n') 13with open('sinsui_tokyo_xmldata.csv', 'w', encoding='CP932', newline="") as file: # sumodata{}.csvに追記 14 writer = csv.writer(file) 15 writer.writerows([position_split]) 16for i in range(0, 101): 17 print(position_split[i])

投稿2019/11/25 09:03

Taka787

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問