2017-09-03 25 views
0

這是我到目前爲止的代碼:如何使用Python在表格中獲取特定信息?

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 

def make_soup(url): 

    page = urllib.request.urlopen(url) 
    soupdata = BeautifulSoup(page, "html.parser") 
    return soupdata 

soup = make_soup('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh') 

table = soup.find_all('table')[1] 

for record in table.find_all('tr'): 
    for data in record.find_all('td'): 
     print(data.text) 

目前它打印表的內容,通過所有列循環。我怎樣才能做到這一點,所以它可以專門抓取某一列和某一行?舉例來說,如果我想要它抓取第1列&第5列(目前的數據是41-23),它怎麼可能?我可以讓它打印出確切的數據嗎?謝謝。
here is the webpage

+0

那麼,是什麼的'[1]'做'在soup.find_all( '表')結束[1]' –

+0

的[1]指搶頁面上的第二個表。 (因爲頁面上有多個表) –

+0

so ...那麼,在行和單元格上使用該索引有什麼問題? –

回答

1

您無需查看所需的數據的所有列和行。

先準備soup

>>> import bs4 
>>> import requests 
>>> page = requests.get('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh').content 
>>> soup = bs4.BeautifulSoup(page, 'lxml') 

從頁面中獲取所有表格。

>>> tables = soup.findAll('table') 

你已經知道你想要的表是不是第一頁,但在第二個上。讓我們給這個名稱以便於參考。

>>> SAF_vs_ALL_table = tables[1] 

現在讓我們來看看它的行。

>>> SAF_vs_ALL_rows = SAF_vs_ALL_table.findAll('tr') 

它的第一行實際上是一個標題。我們想要第二排。

>>> SAF_vs_ALL_rows[1].text 
'Sat, 26 Aug 2017RC South Africa v Argentina41-235:28-0SaltaA' 

然後讓我們獲取第二行的列,然後查看第五列的HTML。

>>> columns = SAF_vs_ALL_rows[1].findAll('td') 
>>> columns[4] 
<td class="cenb">41-23</td> 

我們可以看到,以下面的方式提取第五列的內容很簡單。

>>> columns[4].text 
'41-23' 

我注意到你在評論中對另一個答案有問題。你可以把這個字符串放到一個變量中供後續使用:

score = columns[4].text 

你說過你是新來的。我們大多數人都是從BeautifulSoup開始的,這對於許多任務來說是最好的。但是,您應該知道有其他選擇。在這種情況下,最好的可能是scrapy。將頁面的HTML放在page之後,這就是所需要的。

>>> from scrapy.selector import Selector 
>>> selector = Selector(text=page) 
>>> selector.xpath('.//table[1]/tr[2]/td[5]/text()').extract()[0] 
'41-23' 
+0

非常感謝您的幫助!您所做的評論非常有幫助!你能不能解釋爲什麼lxml更好用來代替html.parser?有區別嗎?感謝scrapy的建議,我會安裝它並嘗試現在使用它。它看起來更簡單,更容易,所以我想我會使用它。再次感謝一堆! –

+0

各種解析器的優缺點在BeautifulSoup文檔中的https://www.crummy.com/software/BeautifulSoup/bs4/doc/標題下的「安裝解析器」一節中概述。我不認爲在所有標準上統一「更好」。你非常歡迎你的答案。 –

2

使用enumerate它可以讓你獲得索引,並在同一時間的數據:

import urllib 
import urllib.request 
from bs4 import BeautifulSoup 


def make_soup(url): 

    page = urllib.request.urlopen(url) 
    soupdata = BeautifulSoup(page, "html.parser") 
    return soupdata 

soup = make_soup('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=SAF#hrh') 

table = soup.find_all('table')[1] 

for row, record in enumerate(table.find_all('tr')): 
    for col, data in enumerate(record.find_all('td')): 
     if row == 1 and col == 4: 
      print(data.text) 

注意指數在0開始,但因爲你跳過標題行,你想捕捉該行在索引1。而對於第五列,您需要索引4

+0

非常有幫助。謝謝。我是Python的新手,所以爲了這個新手問題 - 我可以保存這些數據供以後使用嗎?我可以將它定義爲一些關鍵詞並在稍後打印出來嗎? –

相關問題