2014-02-20 2 views
0

У меня есть функция, которая анализирует HTML-код, поэтому его легко читать и писать. Чтобы сделать это, я должен разбить строку на несколько разделителей, и, как вы можете видеть, я использовал re.split(), и я не могу найти лучшего решения. Однако, когда я отправляю некоторый HTML, такой как this, он абсолютно не влияет. Это заставило меня поверить, что мое регулярное выражение неправильно написано. Что там должно быть?Почему это регулярное выражение не работает?

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-код, поэтому его легко читать и писать. * Ouch. Почему бы не использовать парсер HTML вместо этого? BeautifulSoup делает это в одном. –

+7

'from bs4 import BeautifulSoup',' print (BeautifulSoup (data) .prettify()) '. –

+0

Обязательная ссылка: http://stackoverflow.com/a/1732454/10077 –

ответ

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] 

, что означает, что все линии разделители были преобразованы в их 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'].

Смежные вопросы