Форум сайта python.su
помогите пожалуйста получить атрибут и содержание тега без использования циклов for как в примере ниже. мне хотелось бы чтобы извлечение происходило только с применением xpath
import pprint import requests import lxml.html import bs4 def get_catalog(): html = ''' <section class="catalog"> <h1>Каталог</h1> <ul class="topnav" style="display: block;"> <li> <a class="selected" href="catalog/iphone" data-category="32">iPhone</a> <ul class="topnav" style="display: none;"> <li> <a href="catalog/iphone_5s" data-category="137">iPhone 5S</a> </li> <li> <a href="catalog/iphone-5s-vip" data-category="150">iPhone 5S VIP</a> </li> </ul> </li> <li> <a href="catalog/ipod" data-category="30">iPod</a> <ul class="topnav"> <li> <a href="catalog/iPod_Nano" data-category="95">iPod Nano</a> </li> <li> <a href="catalog/iPod_Touch" data-category="94">iPod Touch</a> </li> <li> <a href="catalog/iPod_Shuffle" data-category="119">iPod Shuffle</a> </li> </ul> </li> </ul> </section> ''' #print(html) doc = lxml.html.document_fromstring(html) catalogMenu = doc.xpath('//section[@class="catalog"]/ul') if catalogMenu: return catalogMenu else: print('Error find catalog') def parse_catalog_categories(catalogMenuList): catalogCategories = {} href = catalogMenuList[0].xpath('li/a/@href') text = catalogMenuList[0].xpath('li/a/text()') hrefDict = {} for key, value in enumerate(href): hrefDict[key] = value.strip() #pprint.pprint(hrefDict) textDict = {} for key, value in enumerate(text): textDict[key] = value.strip() #pprint.pprint(textDict) for index in hrefDict.keys(): catalogCategories[textDict[index]] = hrefDict[index] #pprint.pprint(catalogCategories) if not catalogCategories: print('Error. list is empty') else: return catalogCategories if __name__ == "__main__": catalogMenuList = get_catalog() catalogCategories = parse_catalog_categories(catalogMenuList) pprint.pprint(catalogCategories)
>>> ================================ RESTART ================================
>>>
{'iPhone': ‘catalog/iphone’, ‘iPod’: ‘catalog/ipod’}
>>>
Отредактировано zlodiak (Фев. 26, 2014 13:49:29)
Офлайн
Циклы можно заменить на:
catalogCategories = dict(zip(text, href))
Офлайн
пожалуй, да. но всё таки мне принципиально хотелось бы обойтись только xpath. потому что может так случиться, что не каждый элемент будет иметь атрибут. но каждый элемент будет иметь текстовое содержание
Отредактировано zlodiak (Фев. 26, 2014 14:35:34)
Офлайн
Как вариант, что то в таком духе:
data = catalogMenuList[0].xpath('li/a[@href]/text()|li/a[text()]/@href') catalogCategories = {} for i in range(0, len(data), 2): key, value = data[i], data[i + 1] if value.is_text: key, value = value, key catalogCategories[key] = value
Офлайн
Не очень понятно, что вам нужно. Вы можете привести *минимальный* HTML и *минимальный* python-код для иллюстрации проблемы? И про pep-8 почитайте.
Офлайн
zlodiakэто как ?
потому что может так случиться, что не каждый элемент будет иметь атрибут
Офлайн