Как очистить информацию о ценах на акции из заданного HTML?

Я пытаюсь получить информацию об акциях от Yahoo Finance. Я понял, как использовать re.findall, чтобы занести цены в список. Если биржевой символ / цена не существует, я нашел способ восстановить его, сказав ['Нет такого тикерного символа']. Моя проблема в том, что мне нужно, чтобы цены и такой символ билета не были найдены в том же списке по порядку. Пока это мой код. Возможно ли иметь два шаблона в findall (), чтобы он мог поместить их в один список?

import urllib.request
import re

li = [i.strip().split() for i in open("Portfolio.txt").readlines()]
li[0:26] =[]
li = [x for x in li if x]
li.sort()


def retrieve_page(url):
    my_socket = urllib.request.urlopen(url)
    dta = str(my_socket.readall())
    my_socket.close()
    price = re.findall((r'<td class="col-price cell-raw:(.*?)"><span'), dta)
    noprice = re.findall(r'<span class ="no-symbol">(.*?):<strong>', dta)
    print(price)
    print(noprice)

retrieve_page("http://finance.yahoo.com/quotes/AAPL,GOOG,HWP,IBM,MSFT")

Мой вывод выглядит следующим образом

['107.120003', '552.25', '164.478699', '46.0938']
['No such ticker symbol']

person Sam Kluender    schedule 30.10.2014    source источник
comment
Вероятно, вы могли бы связать два выражения вместе с помощью |.   -  person anon582847382    schedule 30.10.2014
comment
Нравится? Потому что я получаю сообщение об ошибке price = re.findall ((r '‹td class = col-price cell-raw: (. *?)› ‹Span') | (r '‹ span class = no-symbol ›(. *?): ‹Strong› '), dta)   -  person Sam Kluender    schedule 30.10.2014
comment
Это и есть ваша настоящая программа, скопированная на место? Или это почти точно ваша программа, может быть, перепечатана? Потому что, когда я запускаю эту программу, я не получаю описанного вами результата.   -  person Robᵩ    schedule 30.10.2014
comment
вообще не используйте re, используйте beautifulsoup для синтаксического анализа html   -  person Padraic Cunningham    schedule 30.10.2014


Ответы (1)


Если бы это был я, я бы избегал синтаксического анализа HTML с регулярным выражением и используйте вместо него BeautifulSoup:

import requests
from bs4 import BeautifulSoup

def retrieve_page(url):
    dta = requests.get(url).text
    soup = BeautifulSoup(dta)
    price = soup.find_all(class_=["col-price", "invalid-symbol"])
    price = [next(x.strings) for x in price]
    # fix up ': '
    price = [x.replace(': ','') for x in price]
    print(price)

retrieve_page("http://finance.yahoo.com/quotes/AAPL,GOOG,HWP,IBM,MSFT")

Результат:

['106.54', '547.45', 'No such ticker symbol', '163.86', '45.86']
person Robᵩ    schedule 30.10.2014
comment
OP использует python 3 next(x.strings) - person Padraic Cunningham; 30.10.2014
comment
Спасибо, @PadraicCunningham. Я исправил это. - person Robᵩ; 30.10.2014