日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何使用Python遍歷HTML表和抓取表格數(shù)據(jù)

譯者 | 李睿

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對做網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

審校 | 孫淑娟

表格數(shù)據(jù)是網(wǎng)絡(luò)上最好的數(shù)據(jù)來源之一。它們可以存儲大量有用的信息,同時又不丟失易于閱讀的格式,使其成為數(shù)據(jù)相關(guān)項目的金礦。

無論是抓取足球賽事數(shù)據(jù)還是提取股票市場數(shù)據(jù),都可以使用Python從HTML表中快速訪問、解析和提取數(shù)據(jù),而這需要感謝Requests和Beautiful Soup。

理解HTML表的結(jié)構(gòu)

從視覺上看,HTML表是一組以表格格式顯示信息的行和列。本文主要介紹如何抓取表格數(shù)據(jù):

為了能夠抓取該表中包含的數(shù)據(jù),需要更深入地研究它的編碼。

一般來說,HTML表實際上是使用以下HTML標(biāo)記構(gòu)建的:

  • :標(biāo)志著HTML表的開始  
  • :定義行作為HTML表的標(biāo)題  
  • :表示數(shù)據(jù)所在的部分
  • :表示表中的一行
  •  或 
    :在表中定義單元格  

    ??然而,正如人們在實際場景中看到的,并不是所有開發(fā)人員在構(gòu)建表時都遵循這些約定,這使得一些項目比其他項目更難。不過,了解它們的工作原理對于找到正確的方法至關(guān)重要。

    在瀏覽器中輸入表的??URL??,并檢查頁面,看看在底層發(fā)生了什么。

    這就是這個頁面非常適合練習(xí)用Python抓取表格數(shù)據(jù)的原因。有一個明確的

    標(biāo)簽對打開和關(guān)閉表,所有相關(guān)數(shù)據(jù)都在標(biāo)簽中。它只顯示與前端所選條目數(shù)量匹配的10行。

    關(guān)于這個表還有一些需要了解的事情,即想要抓取的條目共有57個,并且似乎有兩種訪問數(shù)據(jù)的解決方案。第一種是點擊下拉菜單,選擇“100”,顯示所有條目:

    或者單擊“下一步”按鈕以瀏覽分頁。

    那么哪一種方案會更好?這兩種解決方案都會給腳本增加額外的復(fù)雜性,因此,先檢查從哪里提取數(shù)據(jù)。

    當(dāng)然,因為這是一個HTML表,因此所有數(shù)據(jù)都應(yīng)該在HTML文件本身上,而不需要AJAX注入。要驗證這一點,需要右擊>查看頁面來源。接下來,復(fù)制一些單元格并在源代碼中搜索它們。

    對來自不同分頁單元格的多個條目執(zhí)行了相同的操作,盡管前端沒有顯示,但似乎所有目標(biāo)數(shù)據(jù)都在其中。

    有了這些信息,就可以開始編寫代碼了。

    使用Python的Beautiful Soup刪除HTML表

    因為要獲取的所有員工數(shù)據(jù)都在HTML文件中,所以可以使用Requests庫發(fā)送HTTP請求,并使用Beautiful Soup解析響應(yīng)。

    注:對于網(wǎng)頁抓取的新手,本文作者在Python教程中為初學(xué)者創(chuàng)建了一個網(wǎng)絡(luò)抓取教程。盡管新手沒有經(jīng)驗也可以學(xué)習(xí),但從基礎(chǔ)開始總是一個好主意。

    1.發(fā)送主請求  

    在這個項目中創(chuàng)建一個名為python-html-table的新目錄,然后創(chuàng)建一個名為bs4-table-scraper的新文件夾,最后創(chuàng)建一個新的python_table_scraper.py文件。

    從終端pip3安裝請求beautifulsoup4,并將它們導(dǎo)入到項目中,如下所示:

    import requests 
    from bs4 import BeautifulSoup

    要用requests發(fā)送HTTP請求,所需要做的就是設(shè)置一個URL并通過request.get()傳遞它,將返回的HTML存儲在響應(yīng)變量中并輸出response.status_code。

    注:如果完全不熟悉Python,可以使用命令python3python_table_scraper.py從終端運行代碼。

    url = 'https://datatables.net/examples/styling/stripe.html'  
    response = requests.get(url)
    print(response.status_code)

    如果它有效,將會返回一個200狀態(tài)碼。任何其他情況都意味著IP正在被網(wǎng)站設(shè)置的反抓取系統(tǒng)拒絕。一個潛在的解決方案是在腳本中添加自定義標(biāo)題,使腳本看起來更加人性化,但這可能還不夠。另一個解決方案是使用Web抓取API處理所有這些復(fù)雜的問題。

    2.使用Beautiful Soup構(gòu)建解析器  

    在提取數(shù)據(jù)之前,需要將原始HTML轉(zhuǎn)換為格式化或解析的數(shù)據(jù)。將這個解析后的HTML存儲到一個soup對象中,如下所示:

    soup = BeautifulSoup(response.text, 'html.parser')

    從這里開始,可以使用HTML標(biāo)記及其屬性遍歷解析樹。

    如果返回到頁面上的表,已經(jīng)看到該表用類stripe dataTable封裝在

    標(biāo)記之間,可以使用它來選擇該表。

    table = soup.find('table', class_ = 'stripe') 
    print(table)

    注:在測試之后,添加第二個類(dataTable)并沒有返回元素。實際上,在return元素中,表的類只是stripe。還可以使用id='example'。

    以下是它返回的結(jié)果:

    Table Return

    既然已經(jīng)獲取了表,就可以遍歷行并獲取所需的數(shù)據(jù)。

    3.遍歷HTML表  

    回想一下HTML表的結(jié)構(gòu),每一行都由

    元素表示,其中有包含數(shù)據(jù)的標(biāo)簽對之間。

    為了提取數(shù)據(jù),將創(chuàng)建兩個for looks,一個用于抓取表的

    部分(所有行所在的位置),另一個用于將所有行存儲到可以使用的變量中:

    for employee_data in table.find_all('tbody'):  
    rows = employee_data.find_all('tr')
    print(rows)

    在行中,將存儲表正文部分中找到的所有

    元素。如果遵循這個邏輯,下一步就是將每一行存儲到單個對象中,并循環(huán)遍歷它們以查找所需的數(shù)據(jù)。

    首先,嘗試使用.querySelectorAll()方法在瀏覽器控制臺上選擇第一個員工的名字。這個方法的一個真正有用的特性是,可以越來越深入地實現(xiàn)大于(>)符號的層次結(jié)構(gòu),以定義父元素(在左側(cè))和要獲取的子元素(在右側(cè))。

    document.querySelectorAll('table.stripe > tbody > tr > td')[0]

    如上所見,一旦抓取所有

    元素,所有這些都包裝在
    元素,這些元素就會成為節(jié)點列表。因為不能依賴類來獲取每個單元格,所以只需要知道它們在索引中的位置,而第一個name是0。

    從那里,可以像這樣編寫代碼:

    for row in rows:    
    name = row.find_all('td')[0].text
    print(name)

    簡單地說,逐個獲取每一行,并找到其中的所有單元格,一旦有了列表,只獲取索引中的第一個單元格(position 0),然后使用.text方法只獲取元素的文本,忽略不需要的HTML數(shù)據(jù)。

    這是一個包含所有員工姓名的列表! 對于其余部分,只需要遵循同樣的邏輯:

    position = row.find_all('td')[1].text 
    office = row.find_all('td')[2].text
    age = row.find_all('td')[3].text
    start_date = row.find_all('td')[4].text
    salary = row.find_all('td')[5].text

    然而,將所有這些數(shù)據(jù)輸出在控制臺上并沒有太大幫助。與其相反,可以將這些數(shù)據(jù)存儲為一種、更有用的新格式。

    4.將表格數(shù)據(jù)存儲到JSON文件中  

    雖然可以輕松地創(chuàng)建一個CSV文件并將數(shù)據(jù)發(fā)送到那里,但如果可以使用抓取的數(shù)據(jù)創(chuàng)建一些新內(nèi)容,那么這將不是最容易管理的格式。

    盡管如此,以前做的一個項目解釋了如何創(chuàng)建一個CSV文件來存儲抓取的數(shù)據(jù)。

    好消息是,Python有自己的JSON模塊來處理JSON對象,所以不需要安裝任何程序,只需要導(dǎo)入它。

    import json

    但是,在繼續(xù)并創(chuàng)建JSON文件之前,需要將所有這些抓取的數(shù)據(jù)轉(zhuǎn)換為一個列表。為此,將在循環(huán)外部創(chuàng)建一個空數(shù)組。

    employee_list = []

    然后向它追加數(shù)據(jù),每個循環(huán)向數(shù)組追加一個新對象。

    employee_list.append({    'Name': name,    'Position': position,    'Office': office,    'Age': age,    'Start date': start_date,    'salary': salary })

    如果print(employee_list),其結(jié)果如下:

    Employee_List

    還是有點混亂,但已經(jīng)有了一組準(zhǔn)備轉(zhuǎn)換為JSON的對象。

    注:作為測試,輸出employee_list的長度,它返回57,這是抓取的正確行數(shù)(行現(xiàn)在是數(shù)組中的對象)。

    將列表導(dǎo)入到JSON只需要兩行代碼:

    with open('json_data', 'w') as json_file:   
    json.dump(employee_list, json_file, indent=2)
    • 首先,打開一個新文件,傳入想要的文件名稱(json_data)和'w',因為想要寫入數(shù)據(jù)。  
    • 接下來,使用.dump()函數(shù)從數(shù)組(employee_list)和indent=2中轉(zhuǎn)儲數(shù)據(jù),這樣每個對象都有自己的行,而不是所有內(nèi)容都在一個不可讀的行中。  

    5.運行腳本和完整代碼  

    如果一直按照下面的方法做,那么代碼庫應(yīng)該是這樣的:

    #dependencies 
    import requests
    from bs4 import BeautifulSoup
    import json
    url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html'
    #empty array
    employee_list = []
    #requesting and parsing the HTML file
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    #selecting the table
    table = soup.find('table', class_ = 'stripe')
    #storing all rows into one variable
    for employee_data in table.find_all('tbody'):
    rows = employee_data.find_all('tr')
    #looping through the HTML table to scrape the data
    for row in rows:
    name = row.find_all('td')[0].text
    position = row.find_all('td')[1].text
    office = row.find_all('td')[2].text
    age = row.find_all('td')[3].text
    start_date = row.find_all('td')[4].text
    salary = row.find_all('td')[5].text
    #sending scraped data to the empty array
    employee_list.append({
    'Name': name,
    'Position': position,
    'Office': office,
    'Age': age,
    'Start date': start_date,
    'salary': salary
    })
    #importing the array to a JSON file
    with open('employee_data', 'w') as json_file:
    json.dump(employee_list, json_file, indent=2)

    注:在這里為場景添加了一些注釋。

    以下是JSON文件中的前三個對象:

    以JSON格式存儲抓取數(shù)據(jù)允將信息用于新的應(yīng)用程序

    使用Pandas抓取HTML表  

    在離開頁面之前,希望探索第二種抓取HTML表的方法。只需幾行代碼,就可以從HTML文檔中抓取所有表格數(shù)據(jù),并使用Pandas將其存儲到數(shù)據(jù)框架中。

    在項目的目錄中創(chuàng)建一個新文件夾(將其命名為panda-html-table-scraper),并創(chuàng)建一個新文件名pandas_table_scraper.py。

    打開一個新的終端,導(dǎo)航到剛剛創(chuàng)建的文件夾(cdpanda-html-table-scraper),并從那里安裝pandas:

    pip install pandas

    在文件的頂部導(dǎo)入它。

    import pandas as pd

    Pandas有一個名為read_html()的函數(shù),它主要抓取目標(biāo)URL,并返回所有HTML表作為DataFrame對象的列表。

    要實現(xiàn)這一點,HTML表至少需要結(jié)構(gòu)化,因為該函數(shù)將查找

    之類的元素來標(biāo)識文件中的表。

    為了使用這個函數(shù),需要創(chuàng)建一個新變量,并將之前使用的URL傳遞給它:

    employee_datapd.read_html('http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html')

    當(dāng)輸出它時,它將返回頁面內(nèi)的HTML表列表。

    HTMLTables

    如果比較DataFrame中的前三行,它們與采用BeautifulSoup抓取的結(jié)果完全匹配。

    為了處理JSON,Pandas可以有一個內(nèi)置的.to_json()函數(shù)。它將把DataFrame對象列表轉(zhuǎn)換為JSON字符串。

    而所需要做的就是調(diào)用DataFrame上的方法,并傳入路徑、格式(split,data,records,index等),并添加縮進以使其更具可讀性:

    employee_data[0].to_json('./employee_list.json', orient='index', indent=2)

    如果現(xiàn)在運行代碼,其結(jié)果文件如下:

    Resulting File

    注意,需要從索引([0])中選擇表,因為.read_html()返回一個列表,而不是單個對象。

    以下是完整的代碼以供參考

    import pandas as pd  
    employee_data = pd.read_html('http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&url=https://datatables.net/examples/styling/stripe.html')
    employee_data[0].to_json('./employee_list.json', orient='index', indent=2)

    有了這些新知識,就可以開始抓取網(wǎng)絡(luò)上幾乎所有的HTML表了。只要記住,如果理解了網(wǎng)站的結(jié)構(gòu)和背后的邏輯,就沒有什么是不能抓取的。

    也就是說,只要數(shù)據(jù)在HTML文件中,這些方法就有效。如果遇到動態(tài)生成的表,則需要找到一種新的方法。

    原文標(biāo)題:??How to Use Python to Loop Through HTML Tables and Scrape Tabular Data??,作者:Zoltan Bettenbuk?


    新聞名稱:如何使用Python遍歷HTML表和抓取表格數(shù)據(jù)
    當(dāng)前路徑:http://www.dlmjj.cn/article/dpegsog.html<strike id="wm9t2"><button id="wm9t2"><thead id="wm9t2"></thead></button></strike>
      <strike id="wm9t2"><button id="wm9t2"><thead id="wm9t2"></thead></button></strike>