2017-09-03 15 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]' [1] '' –

+0

soup.find_all( 'テーブル')の末尾に[1]ページの2番目のテーブルをつかむために示しんありません。 (ページに複数の表があるため) –

+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') 

あなたはすでにあなたが欲しいテーブルがページの最初のが、第2ではないことを知っています。簡単な参照のための名前を付けましょう。

ここでその行を取得しましょう。

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

最初の行は実際にはヘッダーです。我々は2番目の行をしたい。

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

次に、2番目の行の列を取得し、次に5番目の列のHTMLを見てみましょう。

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

第5列の内容を次のように抽出するのは簡単なことです。

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

私はあなたが別の答えに対するコメントに気付いた。この文字列を変数に入れて、後で使用することができます。

score = columns[4].text 

これは初めてのことです。私たちのほとんどはBeautifulSoupで始まり、多くの作業に最適です。ただし、選択肢があることに注意してください。この場合、最良は治療である可能性があります。ページの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

ありがとう、非常に参考になりました!あなたが作ったコメントはとても役に立ちます! html.parserの代わりにここでlxmlを使用する方がいい理由を説明してもらえますか?違いはありますか?治療の提案をありがとう、私はそれをインストールし、今それを使用しようとします。それはより簡単に見えるので、私はそれを使用すると思います。もう一度おねがいします! –

+0

さまざまなパーサーの長所と短所については、http://www.crummy.com/software/BeautifulSoup/bs4/doc/の「Beautifulパーパスのインストール」ヘッダーの「BeautifulSoup」のドキュメントを参照してください。私は、すべての基準に対して一様に「より良い」とは考えていません。答えは大歓迎です。 –

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の行。 5列目の場合は、インデックス4が必要です。

+0

非常に役に立ちます。ありがとうございました。私はこの初心者の質問のためにPythonを初めて使いました。後の使用のためにこのデータを保存することはできますか?私はそれをいくつかのキーワードとして定義し、後でそれを印刷することができますか? –

関連する問題