uf.read () прочитает содержимое только один раз.Затем вы должны закрыть его и снова открыть, чтобы прочитать снова.Это верно для любого вида потока.Это, однако, не проблема.
Проблема в том, что чтение из любого двоичного источника, такого как файл или веб-страница, вернет данные в виде bytes
, если вы не укажете кодировку.Но ваше регулярное выражение не указано как тип bytes
, оно указано как Unicode str
.
Модуль re
вполне разумно откажется использовать шаблоны Unicode для байтовых данных, и наоборот,
Решение состоит в том, чтобы сделать шаблон регулярного выражения строкой байтов, что вы делаете, помещая ab перед ним.Отсюда:
match = re.findall(b"<tr>\s*<td>([\w\s.;'(),-/]+)</td>\s+<td>([\w\s.,;'()-/]+)</td>\s*</tr>", text)
Должно работать.Другой вариант - декодировать текст, чтобы он также представлял собой Unicode str
:
encoding = uf.headers.getparam('charset')
text = text.decode(encoding)
match = re.findall("<tr>\s*<td>([\w\s.;'(),-/]+)</td>\s+<td>([\w\s.,;'()-/]+)</td>\s*</tr>", text)
(Кроме того, для извлечения данных из HTML я бы сказал, что lxml - лучший вариант).