Beautifulsoupのパーサーを'html.parser'から'html5lib'へ変更

この間からスクレイピングができなかったりおかしいなと思ってたら'html.parser'のタグ補完が原因でした。

import urllib.request
from bs4 import BeautifulSoup

url = "http://www.police.pref.ehime.jp/sokuho/sokuho.htm"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser', from_encoding='cp932')

print(soup.prettify())

後半は/ddと/dtだらけでスクレイピングできません。

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

パーサーを'html5lib'に変更

import urllib.request
from bs4 import BeautifulSoup

url = "http://www.police.pref.ehime.jp/sokuho/sokuho.htm"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, 'html5lib', from_encoding='cp932')

print(soup.prettify())

Chromeの右クリック
検証

目的のタグを右クリック
Copy-Copy selector

body > table:nth-child(7) > tbody > tr:nth-child(4) > td:nth-child(5) > table > tbody > tr:nth-child(6) > td

nth-childを
nth-of-typeに変更するとBeautifulsoupで取得できます。

td = soup.select('body > table:nth-of-type(7) > tbody > tr:nth-of-type(4) > td:nth-of-type(5) > table > tbody > tr:nth-of-type(6) > td')

www.htmq.com


要素名.クラス名
要素名[属性名= "属性値"]




で真ん中のddを取得したいとき

tbody > tr > td > dl > dd:nth-child(3n + 2)
tbody > tr > td > dl > dt+dd


tbody > tr > td > dl > dt+dd