2016-12-15 10 views
2

BeautifulSoup &ここでHTML初心者は、このタイプのページを見たことがありません。ウィスコンシン州デーン郡の2008年の大統領選挙のデータを引き出しようとしています。これを解析するには? BeautifulSoupとPythonを使用してHTML以外のWebページからデータを取得しようとしています

リンク:https://www.countyofdane.com/clerk/elect2008d.html

大統領選のためのデータは、ハードコードされたテーブルのように見えるものの中にいるのですか?それはHTMLタグの間に格納されていません。

< !-- #-->何とか繰り返すことでデータを取得できますか?ページをHTMLファイルとして保存して、テーブルの周りにbodyタグを追加すると、解析が容易になるでしょうか?

+0

この時点でテキストを解析しています。 BeautifulSoupは何の助けにもなりません。実際のデータを解析するのはかなり簡単ですが、対角線の見出しは難しいでしょう。 – kindall

+0

'

' and '
'タグの間にテキストを入れたら、正規表現で解析する方がよいでしょう。 –

+0

@kindall技術的にヘッダーを解析することはあまり複雑ではありません。まず、それらが占める行数を測定する必要があります。次に、各行の先頭にどれだけのスペースを置く必要があるかを測定することができます。次に、列を開始する各文字は名前であり、列の末尾の各文字は別の名前です。列は '----'のマークです。まあ、それは複雑で、ただ不可能ではありません。 –

答えて

3

この問題のテーブルが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'], 
     ... 
    ], 
    ... 
] 

これ、もちろん、テーブル名と対角のヘッダーが含まれていません。それは得るのは難しいことですが、不可能ではありません。さらに、合計行を表の他のデータ行から分離したいと思うでしょう。いずれにせよ、これはあなたのための良いスタートの例になると思います。

+0

申し訳ありませんが、2つのnoob質問:1) ".pre"は "for soup.pre.get_text()の行にしますsplitlines():" 2)私はさらにppprintに苦労しています。ドキュメンテーション?あなたと同じことを私が見ていることを確認したいと思います。 – kfish15

+0

@ kfish15、問題ありません。 1) 'soup.pre'は' soup.find( "pre") 'に相当します。 2) 'pprint()'は単に印刷するためのものであり、コードサンプルで使用するための機能的な目的はありません。ありがとう。 – alecxe

関連する問題