2017-01-27 4 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 я узнал, что я мог бы копаться в том, что немного больше с

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. Есть ли часть этой команды, которую я пропускаю, что получаю такие разные результаты?

Спасибо за помощь!

EDIT: С помощью ответа я закончил использование следующих бит строки, чтобы заменить компонент 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' не получил результат, который я искал, но с объяснением того, что это список тегов и один тег, я смог получить правильный индекс для определенной части, которую я искал, и смог получить regex сузить то, что мне нужно! –

 Смежные вопросы

  • Нет связанных вопросов^_^