2013-05-12 7 views
0

Я прочитал некоторые из примеров здесь, но я такой новичок я не понимаю, некоторые из них и другие, похоже, не работает (возможно, потому, что я такой новичок, но ...Bytes to String или String to Bytes?

import urllib.request 
import re 
Symbols = ['aapl', 'spy' , 'goog' , 'nflx'] 
i = 0 
while i < len(Symbols): 
    Yahoo='http://finance.yahoo.com/q?s=' + Symbols[i] 
    htmlfile = urllib.request.urlopen(Yahoo) 
    htmltext = htmlfile.read() 
    string = Symbols[i] 
    symbol = string.encode('utf-8') 
    pattern= re.compile(b'<span id="yfs_l84_'+ symbol +'">(.+?)</span>') 
    price= re.findall(pattern, htmltext) 
    print('The price of' + str(Symbols[i]) + ' is ' + str(price)) 
    i+=1 

Это не работает, потому что в re.compile заявления я пытаюсь конкатенациями ули и байты.

Мне нужно преобразовать строку в байты, так что я могу позже перебрать список символов и скрести последнюю цену акции от yahoo finance.

У меня такое ощущение, что в моем синтаксисе есть что-то не так d в примерах и документации на python есть аргумент для «кодирования», который, я думаю, является строкой «utf-8», но я действительно не знаю.

Может кто-нибудь помочь мне с этим?

Редактировать: Я использую Bytes здесь, потому что это единственный способ, которым это работает, я получаю ошибку, чтобы изменить его на байты, если я этого не делаю (я использую 3.3).

Ошибка заключается в следующем:

Traceback (most recent call last): 
    File "C:\Users\Deaven And Teigan\Documents\Python Projects\YahooFinance.py", line 14, in <module> 
    pattern= re.compile(b'<span id="yfs_l84_'+ symbol +'">(.+?)</span>') 
TypeError: can't concat bytes to str 
+0

Почему вы создаете регулярное выражение с байтовой строкой? Кроме того, отправьте трассировку стека и исключение с вашим вопросом. –

+0

@Lattyware, TypeError: не может использовать шаблон строки для объекта с байтовым изображением –

ответ

1

Вы должны работать со строками, вплоть до того момента, когда вы на самом деле хотите сделать запрос сети, а не строки смешивания и байты в коде. В общем случае, строки являются абстрактным представлением символов, тогда как байты представляют собой конкретную кодировку (например, Utf-8) строки в последовательность байтов, которая может быть отправлена ​​по сети.

Может быть, вы хотите использовать сырую строку для этой строки:

pattern= re.compile(b'<span id="yfs_l84_'+ symbol +'">(.+?)</span>') 

Вместо этого используйте

r'<span id="yfs_l84_' 
+0

Это позволило мне передать ошибку, упомянутую в главном вопросе выше. Но я получаю новую ошибку. price = re.findall (pattern, htmltext) Файл «C: \ Python33 \ lib \ re.py», строка 201, в findall return _compile (pattern, flags) .findall (string) ТипError: не может использовать шаблон строки на байтовом объекте –

+0

Я думаю, что вы получите объект byes, когда будете читать данные из запроса url в переменную 'htmltext'. Вам необходимо правильно проанализировать данные ответа на что-то более значимое - например. вы должны проверить, как кодируется HTTP-ответ, а затем декодировать байты, которые вы возвращаете в строку, используя это. Затем вы можете сделать регулярное выражение в результирующей строке. –

0

строка = байт (Символы [I], 'UTF-8')

+0

сделано, спасибо всем –

0
import urllib.request 
import re 
Symbols = ['aapl', 'spy' , 'goog' , 'nflx'] 
i = 0 
while i < len(Symbols): 
Yahoo='http://finance.yahoo.com/q?s=' + Symbols[i] 
htmlfile = urllib.request.urlopen(Yahoo) 
htmltext = htmlfile.read() 
string = Symbols[i] 
symbol = string.encode('utf-8') 
pattern= re.compile(b'<span id="yfs_l84_'+ symbol +b'">(.+?)</span>') 
price= re.findall(pattern, htmltext) 
print('The price of' + str(Symbols[i]) + ' is ' + str(price)) 
i+=1 


Hai try this it works 
+0

Нет, не будет, в основном потому, что вы не отступали должным образом. –