2017-06-15 20 views
0

使用python3和bs4我在選擇兩個不同div下的兩個跨度值時遇到問題。python 3 bs4如何選擇某些div下的跨度值

我想實現以下目標。

1.)在lastPriceChg div下選擇「chg chgUp」值。注意:這也可能是「chg chgDown」。即

<div class="lastPriceChg"><span class="price">0.023</span><span class="chg chgUp">0.0001 (0.44%)</span></div> 

2.)有多個「panel」div,但我想要volumeFormatted值。即

<div class="panel"> 
       <strong glossaryid="volume">Volume</strong> 
       <span class="value" val="volumeFormatted">3,851,529</span> 
       <strong class="under">Dividend</strong> 
       <span class="value"><span formatcall="toPrice" val="dividend">N/A</span></span> 
      </div> 

什麼是真正奇怪的是,如果我粘貼HTML網頁到它的工作原理html_doc ...

這裏是我的非工作電流代碼:

url = ('https://www.otcmarkets.com/stock/VDRM/quote') 
page = urllib.request.urlopen(url).read() 
soup = BeautifulSoup(page, "lxml") 

for item in soup.findAll('span', attrs={'class': 'value'}): 
    print(item.text.strip() 

樣品出來的只是體積:

$ python scraper.py 
Get Change 


- 
- 

下不工作:

html_doc = """ 
<div class="panel"> 
       <strong glossaryid="volume">Volume</strong> 
       <span class="value" val="volumeFormatted">3,105,009</span> 
       <strong class="under">Dividend</strong> 
       <span class="value"><span formatcall="toPrice" val="dividend">N/A</span></span> 
      </div> 
""" 
soup = BeautifulSoup(page, "lxml") 

for item in soup.findAll('span', attrs={'class': 'value'}): 
    print(item.text.strip() 

樣品出來只是量:

$ python scraper.py 
Get Change 
3,105,009 
N/A 

那麼,爲什麼這不是從網站實際讀取時的工作?

編輯:下面是從跨類檢查屏幕截圖我要找: inpect screen shot of spans

+0

當我檢查您提供的網址中的HTML時,我無法找到任何這些字符串:'lastPriceChg','chgUp','chgDown'。你確信你的問題是正確指定的嗎? –

+0

是@BillBell。您是否已經點擊主頁或使用直接鏈接獲取股票代碼,如otcmarkets.com/stock/VDRM/quote?這些值在quoteData div類下。我也會發佈一個屏幕截圖。 – Micmizer

+0

我在你的'非工作當前代碼'中使用了你的Python名稱'url'中的地址。 –

回答

0

信不信由你,你要真的不會出現在我收到的頁面的東西。我想這是因爲你生活在不同的地緣政治區域。這就是HTML的有趣領域對我來說的樣子。 contents of div missing除此之外,其他項目的文本也是空的。

不管。我從圖片的HTML中添加了第一個div中缺少的內容,我可以展示如何在不需要這樣做的情況下獲得問題第二部分的內容。

我用添加的東西打開HTML文件。我要告訴你的主要事情是,你可以用下面的方式直接指定你想要的元素。

>>> soup = bs4.BeautifulSoup(open('temp.htm').read(),'lxml') 
>>> spans = soup.findAll('span', attrs={'class': 'chg'}) 
>>> spans[0].text 
'0.0022 (9.17%)' 
>>> spans_2 = soup.findAll('span', attrs={'val': 'dividend'}) 
>>> spans_2[0].text 
'\n' 

不幸的是,我不能保證這對你有用。

+0

我猜這是我的問題,或障礙。我不明白爲什麼數據不存在。也許這與頁面中的JavaScript有關?我發現這個數據的替代來源可以正常工作。 – Micmizer

0

正如我在我的評論中提到的,這裏是使用替代來源的新代碼。它更容易,然後我現在認爲我實際上獲取返回數據。 =)

url = ('http://www.marketwatch.com/investing/stock/vdrm') 
page = urllib.request.urlopen(url).read() 
soup = BeautifulSoup(page, "lxml") 
vol = soup.find('span', attrs={'class': 'volume last-value'}) 
volume = vol.text.strip() 
chg = soup.find('span', attrs={'class': 'change--percent--q'}) 
change = chg.text.strip() 
print ("Vol: {} Change: {}".format(volume, change))