0

このウィキペディアのページからデータをスクレイピングしようとしているプロジェクトに取り組んでいます。年の列 (たまたま<th>) と 4 番目の列「ウォルト ディズニー パークス アンド リゾート」が必要です。

コード:

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://en.wikipedia.org/wiki/The_Walt_Disney_Company#Revenues")
bsObj = BeautifulSoup(html, "html.parser")

t = open("scrape_project.txt", "w")

year = bsObj.find("table", {"class":"wikitable"}).tr.next_sibling.next_sibling.th
money = bsObj.find("table", {"class":"wikitable"}).td.next_sibling.next_sibling.next_sibling.next_sibling

for year_data in year:
    year.sup.clear()
    print(year.get_text())

for revenue in money:
    print(money.get_text())


t.close()

現在、ターミナルで実行すると、1991 (2 回) と 2,794 だけが出力されます。ウォルト ディズニー パークス アンド リゾーツからのすべての年と関連する収益を印刷するために必要です。また、ファイル「scrape_project.tx」に書き込むようにしようとしています

どんな助けでも大歓迎です!

4

2 に答える 2

0
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://en.wikipedia.org/wiki/The_Walt_Disney_Company#Revenues")
soup = BeautifulSoup(html)

t = open("scrape_project.txt", "w")

table = soup.find('table', {"class": "wikitable"})

# get all rows, skipping first empty
data = table.select("tr")[1:]

# year data is in the scope attribute
years = [td.select("th[scope]")[0].text[:4] for td in data]

# Walt Disney Parks and Resort is the third element in each row
rec = [td.select("td")[2].text for td in data]

from pprint import pprint as pp

pp(years)
pp(rec)

これにより、次のデータが得られます。

['1991',
 '1992',
 '1993',
 '1994',
 '1995',
 '1996',
 '1997',
 '1998',
 '1999',
 '2000',
 '2001',
 '2002',
 '2003',
 '2004',
 '2005',
 '2006',
 '2007',
 '2008',
 '2009',
 '2010',
 '2011',
 '2012',
 '2013',
 '2014']
['2,794.0',
 '3,306',
 '3,440.7',
 '3,463.6',
 '3,959.8',
 '4,142[Rev 3]',
 '5,014',
 '5,532',
 '6,106',
 '6,803',
 '6,009',
 '6,691',
 '6,412',
 '7,750',
 '9,023',
 '9,925',
 '10,626',
 '11,504',
 '10,667',
 '10,761',
 '11,797',
 '12,920',
 '14,087',
 '15,099']

text[:4]情報を保持したい場合は、スライスしないでください。お金からも削除したい場合、つまり から Rev 3 を削除したい場合は'4,142[Rev 3]'、正規表現を使用できます。

import re

m = re.compile("\d+,\d+")

rec = [m.search(td.select("td")[2].text).group() for td in data]

これはあなたに与えるでしょう:

['2,794',
 '3,306',
 '3,440',
 '3,463',
 '3,959',
 '4,142',
 '5,014',
 '5,532',
 '6,106',
 '6,803',
 '6,009',
 '6,691',
 '6,412',
 '7,750',
 '9,023',
 '9,925',
 '10,626',
 '11,504',
 '10,667',
 '10,761',
 '11,797',
 '12,920',
 '14,087',
 '15,099']
于 2016-03-19T15:20:59.830 に答える
-1

そこに入るにはよりクリーンな方法が必要ですが、これで十分です。

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("https://en.wikipedia.org/wiki/The_Walt_Disney_Company#Revenues")
soup = BeautifulSoup(html, "html.parser")

table = soup.find("table", {"class":"wikitable"})

rows = [row for row in table.findAll("th", {"scope":"row"})]

for each in rows:
    string = each.text[:4] + ", $" + \
          each.next_sibling.next_sibling.next_sibling.next_sibling.next_sibling.next_sibling.text)
于 2016-03-19T03:09:48.870 に答える