Почему это регулярное выражение не работает?

0

У меня есть функция, которая анализирует 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

Это не дубликат, если вы обнаружите аналогичный вопрос, я ползаю на протяжении целых веков, и он все еще не работает.

  • 2
    У меня есть функция, которая анализирует HTML-код, поэтому его легко читать и писать. Уч. Почему бы не использовать вместо этого анализатор HTML? BeautifulSoup делает это в одном.
  • 7
    from bs4 import BeautifulSoup , print(BeautifulSoup(data).prettify()) .
Показать ещё 5 комментариев
Теги:

1 ответ

2
Лучший ответ

Вы преобразуете значение 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'].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню