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

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

ただいまの
回答率

90.49%

  • Python 3.x

    10189questions

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

  • MacOS(OSX)

    2387questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Django

    1685questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python3系でnot well-formedエラー。。。泣

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,330

k-okina

score 10

発生した問題

上手くコードが動いていたのに、とある部分で急にエラーを吐いて凄く困る。。。

エラー内容

Traceback (most recent call last):
  File "/Users/k-okina/.pyenv/versions/3.5.0/lib/python3.5/multiprocessing/process.py", line 254, in _bootstrap
    self.run()
  File "/Users/k-okina/.pyenv/versions/3.5.0/lib/python3.5/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/k-okina/Documents/misocks-api-py/cron/companies/step1.py", line 83, in craete_xbrl_url_json
    ET_tree = ET.fromstring( response_string )
  File "/Users/k-okina/.pyenv/versions/3.5.0/lib/python3.5/xml/etree/ElementTree.py", line 1321, in XML
    parser.feed(text)
  File "<string>", line None
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 20, column 61

ソースコード

# -*- coding: utf-8 -*-
import requests
import xml.etree.ElementTree as ET
import json
import os
import io
import re
import multiprocessing
from collections import defaultdict
from datetime import datetime as dt

proc = 4    # マルチプロセス制御

def get_link_info_str(ticker_symbol, base_url):
    url = base_url+ticker_symbol
    response = requests.get(url)
    return response.text

def get_link(tree, namespace, since):
    yuho_dict = defaultdict(dict)
    #entryタグ毎にforeach
    for el in tree.findall('.//'+namespace+'entry'):

        #titleタグに有価証券の文字があれば、後続処理を実行
        title = el.find(namespace+'title').text
        if not is_yuho(title): continue

        updated = el.find(namespace+'updated').text
        if not time_check(updated,since): return yuho_dict

        # zipファイルのアドレスを辞書オブジェクトへ登録
        _id = el.find(namespace+'id').text
        link = el.find('./'+namespace+'link[@type="application/zip"]')
        url = link.attrib['href']
        cd = re.sub(r'^【(\w+)】.*',r"\1",title)
        yuho_dict[_id] = {'id':_id,'title':title,'cd':cd,'url':url,'update':updated}
    return yuho_dict

def is_yuho(title):
    if u'有価証券報告書' in str(title):
        return True
    else:
        return False

def time_check(update,since):
    updated_time = dt.strptime(update, '%Y-%m-%dT%H:%M:%S+09:00')
    return updated_time>=since

def make_directory(dir_name):
    if not os.path.exists(dir_name):
        os.mkdir(dir_name)

def write_download_info(ofname,info_dict):
    with open(ofname,'w') as of:
        json.dump(info_dict, of, indent=4)

def multi_controller(since):
    p = 0
    jobs = []
    while(p < proc):
        job = multiprocessing.Process(target=craete_xbrl_url_json, args=(since,p,))
        jobs.append(job)
        job.start()
        p += 1
    [job.join() for job in jobs]

def craete_xbrl_url_json(since,p):
    #有報キャッチャーWebServiceのAtomAPIアドレス<http://resource.ufocatch.com/>
    base_url = 'http://resource.ufocatch.com/atom/edinetx/query/'
    namespace = '{http://www.w3.org/2005/Atom}'
    #有報キャッチャーのページ
    page = 1 + p
    count = 0

    while True:
        #文字列変換
        t_symbol = str(page)
        print('page:'+t_symbol + ', loading...')

        #企業毎の有報へのデータへのリンク情報を取得
        response_string = get_link_info_str(t_symbol, base_url)
        #xmlをparseするElementTreeを取得
        ET_tree = ET.fromstring( response_string )
        ET.register_namespace('',namespace[1:-1])

        #downloadファイルの対象を取得
        info_dict = get_link(ET_tree,namespace,since)
        count += len(info_dict)
        if len(info_dict) == 0 : 
            #取得データがなくなり次第、処理終了
            print('process' + str(p) + ':complete a download!! [' + str(count) + ']')
            break

        #Request用のJson形式のファイルを作成
        json_directory=os.getcwd()+'/downloaded_info'
        make_directory(json_directory)
        ofname = json_directory+'/dat_download_'+t_symbol+'.json'
        write_download_info(ofname,info_dict)

        page += proc

def handle():
    #TODO 取得データの末尾(以下例では、2015/07/17以降のデータを取得)
    since = dt.strptime('2015-07-17','%Y-%m-%d')
    print('since:', since)
    #一定期間に発生したデータ全てのURLを取得する
    multi_controller(since)

こんな感じで治るって聞いたけど、それは2系限定の話だった

from lxml import etree
parser = etree.XMLParser(recover=True)
etree.fromstring(xmlstring, parser=parser)


これを遡るに多分ここでのエラー

#xmlをparseするElementTreeを取得
ET_tree = ET.fromstring( response_string )

最後に

助けてください。。。。泣
python3難しい。。。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

対象のXML文字列を提示しない限り、誰にも原因はわからないと思います。

とはいえ、例えばエスケープされていない文字がある場合は、以下のように置換で回避できるようです。
XML中に実体参照していない & がある場合、ElementTree.parse で失敗するが、文字列置換で強引に修復

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

返事ありがとうございます!
そうですよね、、、
from lxml import etree
parser = etree.XMLParser(recover=True)
etree.fromstring(xmlstring, parser=parser)
の様な、素晴らしい機能があったらなぁ、と思ったのですが、それは怠慢ですよね。
一度エラー発生部分のxmlをログ出力する様にして、原因を解析してみます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Python 3.x

    10189questions

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

  • MacOS(OSX)

    2387questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Django

    1685questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。