ScrapingしたデータはJSON形式で保存しているが、最初はPHPでのページ作成が簡単なので、XML形式としていた。
Scrapingを参考にさせてもらったページがCSV形式だったので、作ったCSVをエクセルで開いてからVBAを用いてXMLファイルを作成していた。
pythonで作成したUTF-8のCSVファイルはencoding="utf_8_sig"となっていて、BOM付。
なので、エクセルで読み込んだ時には、文字化けしない、
けれども、VBAで出力するとやはりASCIIコードになってしまう。(CP932ですか)
これはメモ帳で開いてUTF8に変換していた。めんどくさい。
PythonでCSVからXMLへの変換プログラムを、勉強がてら作成した。
ScrapingするときにXMLにしとけ、という話だが、(JSONはそうした)
ここはコンバートすることに意味がある。
注意点 その1
BOM付だと、pythonで処理するときに、先頭文字が文字化けした。
BOMなしが良い。encoding="utf_8"
注意点 その2
CSVの項目名からタグを作って、そのテキストとしてCSVの値をセットする。
一連のタグがデータ件数分、作成されていたが、値は全て先頭のレコードに書き込まれる。
つまり全て上書きされて、最初のレコードに最後の1件だけ書かれている。
あとはデータ件数分の空タグになる。
タグ名はCSVモジュールのDictReaderで引っ張ってきて、配列に入れる。
data=[]
with open(input_file, 'r', encoding='utf-8', newline="", errors=None) as f:
reader = csv.DictReader(f)
for r in reader:
・・・
csvtitle=list(r.keys())
for ttl in csvtitle:
data.append( ET.SubElement(race,ttl))
それから、
配列を利用して、テキストをセットする。
csvvalue = list(r.values())
vcnt = 0
for vtext in csvvalue:
data[vcnt].text= vtext
vcnt += 1
data配列からタグを指定して値をセットするが、最初のタグしか指定できていない。
data[vcnt]
2次元配列にしないとだめなのか。
1行セットするたびに、配列を削除してみよう。
data=[]
こんなやり方でよいのだろうか。
でもできた。