У меня есть функция, которая анализирует HTML-код, поэтому его легко читать и писать. Для этого я должен разбить строку на несколько разделителей, и, как вы видите, я использовал re.split()
и я не могу найти лучшего решения. Однако, когда я отправляю некоторый HTML такой, как это, он абсолютно не влияет. Это заставило меня поверить, что мое регулярное выражение неправильно написано. Что там должно быть?
def parsed(data):
"""Removes junk from the data so it can be easily processed."""
data = str(data)
# This checks for a cruft and removes it if it exists.
if re.search("b'", data):
data = data[2:-1]
lines = re.split(r'\r|\n', data) # This clarifies the lines for writing.
return lines
Это не дубликат, если вы обнаружите аналогичный вопрос, я ползаю на протяжении целых веков, и он все еще не работает.
Вы преобразуете значение bytes
в строку:
data = str(data)
# This checks for a cruft and removes it if it exists.
if re.search("b'", data):
data = data[2:-1]
это означает, что все разделители строк были преобразованы в их escape-коды Python:
>>> str(b'\n')
"b'\n'"
Это буквальная буква b
, буквальная цитата, буквальная \
обратная косая черта, буквальная n
, буквальная цитата. Вместо этого вам придется разбить на r'(\\n|\\r)'
, но, прежде всего, вы не должны указывать байтовые значения для строковых представлений. Python создавал представление значения байтов как литеральной строки, которую вы можете вставить обратно в свой интерпретатор Python, что не совпадает с значением, содержащимся в объекте.
Вместо этого вы хотите декодировать строку:
if isinstance(data, bytes):
data = data.decode('utf8')
где я предполагаю, что данные кодируются с помощью UTF8. Если это данные из веб-запроса, заголовки ответов довольно часто включают набор символов, используемый для кодирования данных в заголовке Content-Type
, ищите параметр charset=
.
Ответ, полученный модулем urllib.request
имеет метод .info()
, и набор символов может быть извлечен (если предоставлен) с помощью:
charset = response.info().get_param('charset')
где возвращаемое значение равно None
если набор символов не указан.
Вам не нужно использовать регулярное выражение для разделения строк, тип str
имеет выделенный метод, str.splitlines()
:
Возвращает список строк в строке, разбивая границы строк. Этот метод использует универсальный подход новых линий к линиям расщепления. Разрыв строки не включается в результирующий список, если не указано и верно.
Например,
'ab c\n\nde fg\rkl\r\n'.splitlines()
возвращает['ab c', '', 'de fg', 'kl']
, а тот же вызов сsplitlines(True)
возвращает['ab c\n', '\n', 'de fg\r', 'kl\r\n']
.
from bs4 import BeautifulSoup
,print(BeautifulSoup(data).prettify())
.