2016-12-15 21 views
2

BeautifulSoup & HTML新手在這裏,我從來沒有見過這種類型的頁面。我試圖從威斯康星州戴恩縣的2008年總統大選中提取數據。如何解析這個?嘗試使用BeautifulSoup和Python從非HTML網頁獲取數據

鏈接:https://www.countyofdane.com/clerk/elect2008d.html

的總統競選中的數據是在什麼似乎是一個硬編碼的表?它不存儲在HTML標籤之間,或者之前遇到的任何東西。

我可以通過以某種方式遍歷< !-- #-->的東西來獲取數據嗎?我應該將頁面保存爲HTML文件,並在表格中添加一個身體標記,以便更容易解析?

+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

對不起,有兩個noob問題:1)「.pre」在「soup.pre.get_text()」中做了什麼?splitlines():「2)我正在努力進一步ppprint,你能指向我文檔?想確保我看到的是和你一樣的東西 – kfish15

+0

@ kfish15肯定沒問題。 1)'soup.pre'等同於'soup.find(「pre」)'。 2)'pprint()'只是爲了漂亮打印,在代碼示例中沒有使用它的功能。謝謝。 – alecxe

相關問題