2017-08-06 19 views
0

ウェブサイトからデータを取得しようとしています。次のように私のコードは次のとおりです。美しいスープを使ってタグからデータを抽出する方法

import re 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 

# gets a file-like object using urllib2.urlopen 
url = 'http://ecal.forexpros.com/e_cal.php?duration=weekly' 
html = urlopen(url) 

soup = BeautifulSoup(html) 

# loops over all <tr> elements with class 'ec_bg1_tr' or 'ec_bg2_tr' 
for tr in soup.find_all('tr', {'class': re.compile('ec_bg[12]_tr')}): 
    # finds desired data by looking up <td> elements with class names 

    event = tr.find('td', {'class': 'ec_td_event'}).text 
    currency = tr.find('td', {'class': 'ec_td_currency'}).text 
    actual = tr.find('td', {'class': 'ec_td_actual'}).text 
    forecast = tr.find('td', {'class': 'ec_td_forecast'}).text 
    previous = tr.find('td', {'class': 'ec_td_previous'}).text 
    time = tr.find('td', {'class': 'ec_td_time'}).text 
    importance = tr.find('td', {'class': 'ec_td_importance'}).img.get('alt') 

    # the returned strings are unicode, so to print them we need to use a unicode string 
    if importance == 'High': 
     print(u'\t{:5}\t{}\t{:3}\t{:40}\t{:8}\t{:8}\t{:8}'.format(time, importance, currency, event, actual, forecast, previous)) 

次のように結果セットの最初のいくつかのレコードは、次のとおりです。

05:00 High EUR CPI (YoY)         1.3%  1.3%  1.3%  
10:00 High USD Pending Home Sales (MoM)     1.5%  0.7%  -0.7% 
21:45 High CNY Caixin Manufacturing PMI     51.1  50.4  50.4  
00:30 High AUD RBA Interest Rate Decision     1.50%  1.50%  1.50% 
00:30 High AUD RBA Rate Statement               
03:55 High EUR German Manufacturing PMI     58.1  58.3  58.3  
03:55 High EUR German Unemployment Change     -9K   -5K   6K  

私は今、次のWebサイトから類似のデータを取得しようとしている:

https://www.fxstreet.com/economic-calendar

上記のコードを次のように改訂しました。

import re 
from urllib2 import urlopen 
from bs4 import BeautifulSoup 

# gets a file-like object using urllib2.urlopen 
url = 'https://www.fxstreet.com/economic-calendar' 
html = urlopen(url) 

soup = BeautifulSoup(html) 


for tr in soup.find_all('tr', {'class': re.compile('fxst-tr-event fxst-oddRow fxit-eventrow fxst-evenRow ')}): 
    # finds desired data by looking up <div> elements with class names 

    event = tr.find('div', {'class': 'fxit-eventInfo-time fxs_event_time'}).text 
    currency = tr.find('div', {'class': 'fxit-event-name'}).text 
    actual = tr.find('div', {'class': ' fxit-actual'}).text 
    forecast = tr.find('div', {'class': 'fxit-consensus'}).text 
    previous = tr.find('div', {'class': 'fxst-td-previous fxit-previous'}).text 
    time = tr.find('div', {'class': 'fxit-eventInfo-time fxs_event_time'}).text 
# importance = tr.find('td', {'class': 'ec_td_importance'}).img.get('alt') 

    # the returned strings are unicode, so to print them we need to use a unicode string 
    if importance == 'High': 
     print(u'\t{:5}\t{:3}\t{:40}\t{:8}\t{:8}\t{:8}'.format(time, currency, event, actual, forecast, previous)) 

このコードは結果を返しません(おそらく、間違ったタグやクラスを参照しているためです)。誰が私のエラーがどこに見えるのですか?

ありがとうございます!

+0

私はウェブサイトを見ましたが、 'fxst-tr-event fxst-oddRow fxit-eventrow fxst-evenRow'という名前の_class_はありません。 – ksai

答えて

1

あなたはurllib2がそれを処理しない、動的に作成されたJavaScriptのコンテンツを解析するためにselenium + Chromedriver/PhantomJSを使用する必要があります。ここではregexを使用することは意味がないと思いますが、lxmlパーサーを使用して複数のクラスを許可し、リストで使用することができます。

from bs4 import BeautifulSoup 
from selenium import webdriver 

url = 'https://www.fxstreet.com/economic-calendar' 

driver = webdriver.Chrome() 
driver.get(url) 
html = driver.page_source 
soup = BeautifulSoup(html, 'lxml') 

for tr in soup.findAll('tr',{'class':['fxst-tr-event', 'fxst-oddRow', 'fxit-eventrow', 'fxst-evenRow', 'fxs_cal_nextEvent']}): 
    event = tr.find('div', {'class': 'fxit-eventInfo-time fxs_event_time'}).text 
    currency = tr.find('div', {'class': 'fxit-event-name'}).text 
    actual = tr.find('div', {'class': 'fxit-actual'}).text 
    forecast = tr.find('div', {'class': 'fxit-consensus'}).text 
    previous = tr.find('div', {'class': 'fxst-td-previous fxit-previous'}).text 
    time = tr.find('div', {'class': 'fxit-eventInfo-time fxs_event_time'}).text 

    print(time, currency, event, actual, forecast, previous) 

lxmlライブラリ自体は、あなたが標準html.parserを使用して複数のクラスを扱うことができているが、それは私の意見のように直感的ではありません。以下は、すでに述べたツールを使用した例があります。このコードを印刷:私はあなたがそれらになりたいものを本当にわからないので、私は変数のいずれかを変更していない

14:00 
CAD          14:00 None 59.2 
61.6          
14:00 
CAD          14:00 52.9 
63.9          
17:00 
USD          17:00 765 
... 
... 

ので、さらにそれを調整し、出力のフォーマットは、理想的でなければなりません。

+0

ありがとうございました。私は 'ボラティリティ= tr.find(' div '、{' class ':' fxit-eventInfo-vol-c fxit-event-info-desktop '}を挿入することで'期待ボラティリティ 'を含むようにコードを修正しようとしています).text 'をforループの最後の変数として使用します。それは動作していないようです。どんな考え? – equanimity

+0

それは私のために、1と2の束に動作します。期待される成果は? –

+0

期待される出力は、1 =「低ボラティリティ期待」、2 =「中程度ボラティリティ期待」、3 =「高ボラティリティ期待値」 – equanimity

関連する問題