Найти - Пользователи
Полная версия: Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.
Начало » Python для новичков » Парсинг с помощью BeautifulSoup, помогите разобрать алгоритм.
1
Jeck290
Есть такая структура 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 идет список или параграф ?
terabayt
зачем вам 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
Jeck290
А как проверить существует ли таблицы и в каком количистве ?
terabayt
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'))
Jeck290
Спасибо за ответы,есть одна загвоздка в предыдущих примерах структура была явная, а как быть если часть структуры явная но бывают иногда маленькие исключения ? Вот например
<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>
Имеем такие таблицы в принципе они имеют свою структуру , но как понять где начинается таблица а где заканчивается ?
И еще такое бывает что в таких таблицах бывает табличка не с тремя строками а с четырмя как в таком случае поступать ?
terabayt
а где в примере таблицы?
таблица это <table>
что вы хотите получить на выходе и что у вас не получается?
Jeck290
Ну в данном примере псевдо таблица представлена тегами strong , нужно распарсить структуру показанную выше, каждая таблица должна выглядеть вот так
[{'East Richford Station':[{'Phone:':'(802) 848-7746'},{'Fax:':'None'}]}]
terabayt
ну за начало таблички можно использовать
<p>
</p>
Jeck290
И еще такое бывает что в таких таблицах бывает табличка не с тремя строками а с четырмя как в таком случае поступать ?
тогда это не важно
прост перебираете все <p> и если текста нету - значит со следущего <p> уже новая табличка, если текст в <p> есть - добавляем в предыдущую табличку
py.user.next
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)'}
Jeck290
да спасибо вроде разобрался.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB