fbpx

Получить из html словарь

276 просмотра
0
0 Комментариев

помогите пожалуйста написать xpath-выражение(или несколько) которое преобразовало бы следующий html

<div class="TabItem">
    <p><strong>Product Composition</strong></p>
    <p>93% Polyamide 7% Elastane</p>
    <p>Lining: 100% Polyester</p><p>Dress Length: 90 cm</p>
 
    <p><strong>Product Attributes;</strong></p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
    <p>Lining Type: Full Lining</p>
</div>

в словарь вида:

data['Product Composition'] = '93% Polyamide 7% Elastane Lining: 100% Polyester Dress Length: 90 cm'
data['Product Attributes;'] = ': Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side Lining Type: Full Lining'

проблема ещё в том, что количество тэгов может быть различным.

так же буду благодарен за любой пинок в нужном направлении


Добавить комментарий

1 Ответы

Python Опубликовано 16.07.2019
0

Вот пример того, что вы хотите.
Если что то не понятно — пишите, я поясню.

from lxml.html import fromstring
 
html = """
<div class="TabItem">
    <p><strong>Product Composition</strong></p>
    <p>93% Polyamide 7% Elastane</p>
    <p>Lining: 100% Polyester</p>
    <p>Dress Length: 90 cm</p>
 
    <p><strong>Product Attributes 1;</strong></p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
    <p>Lining Type: Full Lining</p>
 
    <p><strong>Product Attributes 2;</strong></p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
 
    <p><strong>Product Attributes 3;</strong></p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
    <p>Lining Type: Full Lining</p>
    <p>Lining Type: Full Lining</p>
 
    <p><strong>Product Attributes 4;</strong></p>
    <p>: Boat Neck, Long Sleeve, Midi, Zip, Concealed, Laced, Side</p>
    <p>Lining Type: Full Lining</p>
</div>"""
 
tree = fromstring(html)
 
# получим все <p> одним списком
items = tree.xpath('//div[<a href="/users/4572/classltd">@class</a>="TabItem"]/p')
 
# составим список номеров <p> содержащих <strong>
group_map = [x[0] for x in filter(lambda x: x[1], enumerate([bool(x.xpath('strong')) for x in items]))]
 
# разобьем список всех <p> на группы
groups = []
for i, index in enumerate(group_map):
    if i < len(group_map) - 1:
        groups.append(items[group_map[i]:group_map[i+1]])
    else:
        groups.append(items[group_map[i]:])
 
# превратим список групп в нужный словарь
result = dict([(x[0].xpath('strong')[0].text, ' '.join(map(lambda x: x.text, x[1:]))) for x in groups])
 
print result

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up