LINUX.ORG.RU

Доступ по индексу после парсинга с re дает результат, отличающийся от запроса

 ,


0

1
import urllib.request
import re


url = 'http://www.vk.com'

request = urllib.request.urlopen(url)
response = request.read()
parse = re.search(r'android', str(response))  

print(parse)
print(response[parse.start():parse.end()])
_________
Output:

<_sre.SRE_Match object; span=(3138, 3145), match='android'>
b'wrap"><'

С кодировками у тебя проблема, а не в доступе по индексу.

b" - это не строка, это последовательность байт. А парсишь ты строку.

E ★★★
()
Ответ на: комментарий от E

Ясно, спасибо. Кстати, не пойму, почему b' не убирается при изменении на str, ведь это уже не байт-тип?

url = 'http://www.vk.com'

request = urllib.request.urlopen(url)
response = request.read()
parse = re.search(r'xml', str(response))  

response_str = str(response)

print(parse)
print(response_str[parse.start()-4:parse.end()])
___
<_sre.SRE_Match object; span=(4, 7), match='xml'>
b'<?xml

kramh
() автор топика
Ответ на: комментарий от gejzenbug

Что-то я совсем запутался. Перевод к строке это и есть декод, разве нет? Вот, например комментарий на тему:

Ошибка в кодировке Python3. Фикс вызывает новую ошибку. (комментарий)

Да и я исправил на str, и скрипт начал работать исправно.

kramh
() автор топика
Ответ на: комментарий от kramh

В твоём случае str() сработал потому, что байты в юникоде, питон по умолчанию перекодирует в строку из юникода. Если была бы другая кодировка, твой код вывалился бы с исключением и ты бы узнал о том, зачем нужно явное перекодирование.

E ★★★
()
Ответ на: комментарий от E

Я, кажется, понял. То есть b' убирается только во время decode(т.е. когда выбираешь кодировку), а т.к. я её не выбрал во время использования str, то питон автоматически из строки байтов декодировал в текстовую строку, но оставил в той же кодировке(это точно не юникод - проверял), и поэтому остается b', хотя тип уже не байтовый у нас. Верно?

kramh
() автор топика
Ответ на: комментарий от E

Например, так не выбрал: mystr = str(mybytes, 'KOI8-R')

Также по Лутцу всего 2 типа строк: байтовые и текстовые.

kramh
() автор топика
Ответ на: комментарий от kramh

Нет, неверно. Тип не байтовый, тип - строка, но он содержит строковое представление байтовой последовательности, включая символы b". Потому что ты не указал кодировку.

Если бы ты пользовался decode или вторым параметром в str, то у тебя байтовая последовательность посимвольно бы сконвертировалась, и получилась бы полноценная декодированная строка, а не строковое представление байтов.

>>>a = b'123'
>>>str(a)
"b'123'"
>>>a.decode('utf-8')
'123'
E ★★★
()
Ответ на: комментарий от E

Неожиданное, кстати, поведение:

>>> repr(b'123')
"b'123'"
>>> str(b'123')
"b'123'"
>>> str(b'123', 'cp1251')
'123'

Первая и последняя строчки весьма осмысленны, а вот средняя лучше бы вообще не работала.

anonymous
()
Ответ на: комментарий от E

Я привык, что в python2 подобного нет.

>>> str(bytearray('123'))
'123'
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.