スクレイピングの開発を行う際には、ブラウザのデバッグツールを使い、htmlの構造を解析しながら、コーディングを行うが、BeautifulSoup経由の場合、Xpathを正しく解釈できないケースに遭遇した。
どうやらテーブル作成に利用するtbodyタグがソースコードに含んでいなくてもブラウザによっては自動で保管されるらしい。
tbodyタグをセレクタから外してXpath指定すれば解決できた。
import requests
from bs4 import BeautifulSoup
from lxml import etree
html = requests.get(<url>)
soup = BeautifulSoup(html.content, "html.parser")
dom = etree.HTML(str(soup))
print(dom.xpath('/html/body//table[1]/tbody/tr[1]/td[2]'))
#[]・・・空になる
#tbodyを消す
print(dom.xpath('/html/body//table[1]/tr[1]/td[2]'))
#[<Element td at 0x120d98580>]・・・取得できた
Seleniumのようなレンダリングも行いながらhtml構造を取得できれば問題ないが、
urllibやrequestsなどを経由して、BeautifulSoupでhtml構造を解釈する場合はソースコードにtbodyが含まれているか注意しながら開発を行う必要がある。
コメント