@PanchAS
Python, Django, 2 месяца

Как считать перевод строки при помощи библиотеки re?

Добрый вечер!

Пишу простой парсер для вывода некоторых полей из страницы интернет-магазина. Например, вот так:
rx_image = r'class="jshop_img (.*)" src="(.*)" alt='
image = re.compile(rx_image)
     for line in page:
        img_obj = image.search(line)
        if img_obj:
            img_item = img_obj.group(2)
            print "Picture:    ", img_item

Проблема заключается в том, что в некоторых местах в HTML-коде есть перевод на новую строку и re не находит соответствий.
Т.е., если код такой:
<img class="jshop_img second-image" src=/components/com_jshopping/files/img_products/thumb_________________________1_.jpg" alt="">

То все работает как надо. Но, если есть такой код:
<div class="name">
						<a href="/component/jshopping/product/view/97/334?Itemid=101">Коктейль молочный малый</a>
											</div>

То он не находить строку. Если искать только код после перевода строки, например:
rx_name = r'<a href="(.*)">(.*)</a>'
то сравнение проходит нормально, но добавляются ненужные мне строки.
Как можно обойти это ограничение? Пробовал писать
image = re.compile(rx_image, re.DOTALL)
Результат не поменялся.
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
@PanchAS Автор вопроса
Python, Django, 2 месяца
В общем, решил не заморачиваться и нагородил костылей.

rx_name_f = r'<div class="name">'
rx_name = r'<a href=.*>(.*)</a>'

name = re.compile(rx_name)
name_f = re.compile(rx_name_f)
i = False
for line in page:
    name_obj = name.search(line)
    namef_obj = name_f.search(line)
            
    if i and name_obj:
        name_item = name_obj.group(1)
        print "Name:", name_item
        i = False
    else:
        i = False
    if namef_obj:
        i = True


Всем спасибо за ответы!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
qlkvg
@qlkvg
python backend developer
Классика
Не забивайте гвозди микроскопом. Потратьте день на изучение парсинга с помощью lxml или beautifulsoup и познаете радость.
Ответ написан
@lega
Можете подготовить/переразбить html, удалить переводы строк и т.п.
''.join(page).replace('\n', '').split('<img')
без split можно использовать re.finditer

Так же можно сначала получить все img, а потом вручную отфильтровать по классу.

Когда-то успешно использовал велосипед, для вас будет что-то типа:
xget(html, 'img@class="jshop_img[\w -]+"~src')

qlkvg Фишка в том что не всегда нужен парсинг, иногда нужно просто выкусить/получить пару слов из html. В моем случае regex работал отлично и быстрее чем lxml (и аналоги) в 100-1000 раз, т.к. нужно было обработать всего 1% документа, а не парсить весь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы