BeautifulSoup为.find和.find_all提供不同的结果

时间:2017-01-27 03:04:49

标签: python python-3.x beautifulsoup

我正在尝试通过实用数据分析书中的练习,目标是从网站上榨取黄金价格。原始代码不起作用,我已将其追溯到我认为从original script开始对网站进行重新设计。

为了让练习继续工作,我一直在努力改进脚本:

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后,我发现我可以用

进一步深入研究
soup.find('script', type="text/javascript").text

代替.find_all()用法并在脚本上运行正则表达式。

除了原来的帖子正则表达式之外,这种方式非常有效,所以我正在努力弄清楚要用什么来获得“问”组的价格。当我回去在文件上调用这个更新的正则表达式时,我的表达式不再提供相同的基本结果。

目前如果我做了

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)

不可否认,我的正则表达式对我的问题非常具体。

1 个答案:

答案 0 :(得分:2)

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

find_all()将返回一个标记列表,如:

[tag1, tag2, tag3]

find()只会返回第一个标记:

tag1

如果要获取标记列表中的所有标记,请使用for循环来迭代它。