Уведомления

Группа в Telegram: @pythonsu

#1 Май 20, 2015 22:50:16

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

Есть такая структура html

<h2>Instructions</h2>
<ul>
    <li style="font-size: 14px;">
    </li>
    <li style="font-size: 14px;">1
    </li>
    <li style="font-size: 14px;">2</li>
</ul>
<h2>Information</h2>
<p style="font-size: 14px;">123</p>
<h2>Requirements</h2>
<p style="font-size: 14px;"></p>
Нам нужно составить три словаря, заголовки h2 это ключ а значения это параграфы или весь список текстом !
Используется библиотека BeautifulSoup, подскажите как определить что после тега h2 идет список или параграф ?



Офлайн

#2 Май 20, 2015 23:10:02

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

зачем вам BeautifulSoup?!

import lxml.html
s = """<h2>Instructions</h2>
<ul>
    <li style="font-size: 14px;">
    </li>
    <li style="font-size: 14px;">1
    </li>
    <li style="font-size: 14px;">2</li>
</ul>
<h2>Information</h2>
<p style="font-size: 14px;">123</p>
<h2>Requirements</h2>
<p style="font-size: 14px;"></p>"""
r = ''
p = lxml.html.fromstring(s)
for i in p.xpath("//h2"):
    n = i.getnext()
    if n.tag == 'ul':
        r += '\n'.join(j.text.strip() for j in n.getchildren() if j.text)
    elif n.tag == 'p' and n.text:
        r += n.text
print r



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Май 21, 2015 18:29:55

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

А как проверить существует ли таблицы и в каком количистве ?



Офлайн

#4 Май 21, 2015 19:31:49

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

import lxml.html
s = """
<table>
<tr><td>
<h2>Instructions</h2>
<ul>
    <li style="font-size: 14px;">
    </li>
    <li style="font-size: 14px;">1
    </li>
    <li style="font-size: 14px;">2</li>
</ul>
<h2>Information</h2>
<p style="font-size: 14px;">123</p>
<h2>Requirements</h2>
<p style="font-size: 14px;"></p>
</td></tr></table>
"""
r = ''
p = lxml.html.fromstring(s)
print len(p.xpath('//table'))



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Май 22, 2015 13:10:46

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

Спасибо за ответы,есть одна загвоздка в предыдущих примерах структура была явная, а как быть если часть структуры явная но бывают иногда маленькие исключения ? Вот например

<p><strong>West
    Berkshire Station</strong></p>
<p><strong>Phone: </strong>(802) 933-4337</p>
<p><strong>Fax: </strong>None</p>
<p><strong>Operational Hours: </strong>12:00
    PM-12:00 PM (Eastern)<br/>Seven Days A Week
    (7)</p>
<p>
</p>
<p></p>
<p><strong>Pinnacle Road Station</strong></p>
<p><strong>Phone: </strong>(802) 848-7721</p>
<p><strong>Fax: </strong>None</p>
<p><strong>Operational Hours: </strong>12:00
    PM-12:00 PM (Eastern)<br/>Seven Days A Week
    (7)</p>
<p>
</p>
<p></p>
<p><strong>East Richford Station</strong></p>
<p><strong>Phone: </strong>(802) 848-7746</p>
<p><strong>Fax: </strong>None</p>
<p><strong>Operational Hours: </strong>12:00
    PM-12:00 PM (Eastern)<br/>Seven Days A Week
    (7)</p>
<p>
</p>
<p></p>
Имеем такие таблицы в принципе они имеют свою структуру , но как понять где начинается таблица а где заканчивается ?
И еще такое бывает что в таких таблицах бывает табличка не с тремя строками а с четырмя как в таком случае поступать ?



Офлайн

#6 Май 22, 2015 14:19:04

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

а где в примере таблицы?
таблица это <table>
что вы хотите получить на выходе и что у вас не получается?



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Май 22, 2015 15:22:22

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

Ну в данном примере псевдо таблица представлена тегами strong , нужно распарсить структуру показанную выше, каждая таблица должна выглядеть вот так

[{'East Richford Station':[{'Phone:':'(802) 848-7746'},{'Fax:':'None'}]}]



Офлайн

#8 Май 22, 2015 20:05:41

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

ну за начало таблички можно использовать

<p>
</p>
Jeck290
И еще такое бывает что в таких таблицах бывает табличка не с тремя строками а с четырмя как в таком случае поступать ?
тогда это не важно
прост перебираете все <p> и если текста нету - значит со следущего <p> уже новая табличка, если текст в <p> есть - добавляем в предыдущую табличку



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Май 23, 2015 02:29:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

Jeck290
должна выглядеть вот так
По идее, одна запись должна выглядеть как один словарь.
d = {'name': 'East Richford Station',
     'phone': '(802) 848-7746',
     'fax': None,
     'optime': '12:00 PM-12:00 PM (Eastern) Seven Days A Week (7)'}



Офлайн

#10 Май 23, 2015 12:49:01

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.

да спасибо вроде разобрался.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version