2017-01-27 85 views
2

我正試圖通過實踐數據分析書中的練習,其目標是從網站上刮取黃金的價格。原始代碼不起作用,我已將其追溯到我認爲是從original script時間起對網站進行的重新工作。BeautifulSoup提供了不同的結果.find和.find_all

要嘗試仍然得到鍛鍊工作,我一直在努力改造的腳本了一下:

from bs4 import BeautifulSoup 
import requests 
import re 
from time import sleep 
from datetime import datetime 

def getGoldPrice(): 
    url = "http://www.gold.org" 
    req = requests.get(url) 
    soup = BeautifulSoup(req.text, "lxml") 
    price = soup.find_all("dd", class_="value")[1] 
    return price 

with open("goldPrice.out","w") as f: 
    for x in range(0,3): 
     sNow = datetime.now().strftime("%I:%M:%S%p") 
     f.write("{0}, {1} \n ".format(sNow, getGoldPrice())) 
     sleep(59) 

,直到我意識到那不是拉有源標籤更新每分鐘這個工作對初始部分(最初的目標)。做了一些more research後,我發現,我可以代替.find_all()使用的挖成多一點用

soup.find('script', type="text/javascript").text 

並運行該腳本正則表達式。

這個工作非常好,除了原有的帖子正則表達式,所以我正在研究如何使用「ask」組獲得價格。當我回到這個文件上調用這個更新的正則表達式時,我的表達式不再提供相同的基本結果。

目前,如果我做了

soup.find_all('script', type="text/javascript") 

我得到不同的結果比用

soup.find('script', type="text/javascript").text 

不幸的是我似乎無法採取soup.find_all結果成的.text像我可以爲soup.find命令命令。是否有這個命令的一部分,我錯過了我得到這樣不同的結果?

感謝您的幫助!

編輯:使用從答案的幫助我結束了使用下面的幾行代替price組件來獲得我正在尋找!

js_text = soup.find_all('script', type="text/javascript")[10] 
    js_text = js_text.string 
    regex = re.compile('"ask":{"css":"minus","price":"(.*)","performance":-1}},"G') 
    price = re.findall(regex, js_text) 

不可否認,我的正則表達式對我的問題非常具體。

回答

2
for a in soup.find_all('script', type="text/javascript"): 
    print(a.text) 

find_all()將返回類似這樣的標記列表:

[tag1, tag2, tag3] 

find()將只返回第一個標記:如果您想在標籤列表中的所有標籤

tag1 

,使用for循環來迭代它。

+1

感謝您的幫助! 'for'循環沒有得到我正在尋找的結果,但解釋它是一個標籤列表與一個標籤,我能夠得到我正在尋找的特定部分的正確索引並能夠獲得正則表達式來縮小我需要的東西! –

相關問題