質問: n.xpath('@eradCode')[0] IndexError: list index out of range になってしまう。 ※eradCodeを持っていない研究者の方がいるため (質問の追記2) 新し目のデータにも未登録になるケースがある。 (1)名前だけ羅列するモード(Eradの有無は考慮しない) (2)Eradだけ羅列するモード(Erad未登録のものはスキップする) (3)Eradと名前を合わせて羅列し、Erad未登録者についてはEradの部分をnullにして、名前だけ出す といったアプローチが考えられる。また、の方にしか personalName/fullName がないケースがあるようだ。 ※名前がなけれは出力なし、として対応した
回答: もうちょっとのところまで実装できてそうです。 `for n in memberlst:`のループの中の`n`がどんな状態か、というところがポイントですね。 `n`の時点で`member`タグが一番上位になっているので、xpathで要素を取得するときは、子要素なり属性なりを指定するだけでよいはずです(memberタグの指定はいらない)。 ついでに、First Authorだけをxpathで取得する必要もないかもしれません。 First Author以外の著者のEradと名前を羅列するなら、以下のような感じだと思います。 名前が不要なら`name`関連の処理を消してください。 ``` from lxml import etree # lxmlライブラリを使用 tree = etree.parse('./kaken.nii.ac.jp_2019-04-12_00-34-28.xml') root = tree.getroot() awards = tree.xpath('/grantAwards/grantAward') records =list() if len(awards): for award in awards: record = list() # 科研費ID grant_id = award.attrib.get('id') or '' record.append(grant_id) # 研究者リストを作る members = award.xpath('summary[@xml:lang="ja"]/member') for m in members: # eradCodeがない場合は空文字で補間 eradCode = m.attrib.get('eradCode') or '' seq = m.attrib.get('sequence') or '' try: name = m.xpath('personalName/fullName').pop().text except IndexError: name = '' if seq == "1": # first author の処理 record.append(eradCode) record.append(str(len(members))) else: record.append(eradCode) record.append(name) records.append(record) #結果をTAB区切りで標準出力 for r in records: print('\t'.join(r)) ```