この問題のテーブルがpre
要素内プレーンテキストにあるので、実際にテキスト解析になります。
ここから始めることができます。考え方は、テーブルの後ろに-----
ヘッダーと空白行を使用して、テーブルの先頭と末尾を検出することです。これらの線に沿って何か:これはリストのリストを印刷し
import re
from bs4 import BeautifulSoup
import requests
from ppprint import pprint
url = "https://www.countyofdane.com/clerk/elect2008d.html"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
is_table_row = False
tables = []
for line in soup.pre.get_text().splitlines():
# beginning of the table
if not is_table_row and "-----" in line:
is_table_row = True
table = []
continue
# end of the table
if is_table_row and not line.strip():
is_table_row = False
tables.append(table)
continue
if is_table_row:
table.append(re.split("\s{2,}", line)) # splitting by 2 or more spaces
pprint(tables)
- すべてのテーブルのデータ行を持つサブリスト:
[
[
['0001 T ALBION WDS 1-2', '753', '315', '2', '4', '1', '0', '5', '2', '0', '1'],
['0002 T BERRY WDS 1-2', '478', '276', '0', '0', '0', '0', '2', '0', '0', '1'],
...
['', 'CANDIDATE TOTALS', '205984', '73065', '435', '983', '103', '20', '1491', '316', '31', '511'],
['', 'CANDIDATE PERCENT', '72.80', '25.82', '.15', '.34', '.03', '.52', '.11', '.01', '.18']],
[
['0001 T ALBION WDS 1-2', '726', '323', '0'],
['0002 T BERRY WDS 1-2', '457', '290', '1'],
['0003 T BLACK EARTH', '180', '107', '0'],
...
],
...
]
これ、もちろん、テーブル名と対角のヘッダーが含まれていません。それは得るのは難しいことですが、不可能ではありません。さらに、合計行を表の他のデータ行から分離したいと思うでしょう。いずれにせよ、これはあなたのための良いスタートの例になると思います。
この時点でテキストを解析しています。 BeautifulSoupは何の助けにもなりません。実際のデータを解析するのはかなり簡単ですが、対角線の見出しは難しいでしょう。 – kindall
'
'タグの間にテキストを入れたら、正規表現で解析する方がよいでしょう。 –@kindall技術的にヘッダーを解析することはあまり複雑ではありません。まず、それらが占める行数を測定する必要があります。次に、各行の先頭にどれだけのスペースを置く必要があるかを測定することができます。次に、列を開始する各文字は名前であり、列の末尾の各文字は別の名前です。列は '----'のマークです。まあ、それは複雑で、ただ不可能ではありません。 –