BeautifulSoup4で改行が邪魔

ワケあって、XMLファイルをparsingしているのだけれど、当然自力でparsingできるわけがないので、調べてみるとPythonのBeautifulSoup4がよい、とのこと。

最初はよく分からなかったが、ファイルハンドルを f とすると、

 

soup = BeautifulSoup(f, "xml")

 

で、XMLファイル自体がsoapオブジェクトに読み込まれる。このオブジェクトは

 

<class 'bs4.BeautifulSoup'>

 

というタイプ。そのまま。で、自分のXMLファイルを見ると一番大きな分類を作っているのがTopClassというタグ(しかも下位には出現しない)なので、

 

for toplevel in soup.find_all("TopClass"):

    処理

 

で、一番大きなセグメント毎に処理を走らせることができる。このときtoplevelオブジェクトは

 

<class 'bs4.element.Tag'>

 

というタイプ。このタイプであれば、子要素、親要素、兄弟要素もろもろにアクセスできる便利なメソッドが使えるので、どんどん下位に向かってこれで欲しいデータが取り出せるかと思ったら、処理中に

 

AttributeError: 'NavigableString' object has no attribute 'Subclass'

 

とかいうエラーが出てうまく処理できない。あれこれやっていると、for文で処理するときに中身のない改行だけ、というものが混じって出てくることが原因のよう。これはオブジェクトとして

 

<class 'bs4.element.NavigableString'>

 

となるようなのだけれど、これには便利なメソッドがほとんど使えない。なので調べると、最初のsoupから改行を取り除けばよい、ということで、やり方は

 

[tag.extract() for tag in soup(string='\n')]

 

でよいようだ。そのまま引き写しで実は文法的にもよく分からないのだけれど、これでforの中のforでどんどん下位にいっても全てTagオブジェクトなので目的の処理をすることができた。