Найти - Пользователи
Полная версия: получить атрибут и содержание тега одновременно
Начало » Data Mining » получить атрибут и содержание тега одновременно
1
zlodiak
помогите пожалуйста получить атрибут и содержание тега без использования циклов 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’}
>>>
Chern
Циклы можно заменить на:
catalogCategories = dict(zip(text, href))
zlodiak
пожалуй, да. но всё таки мне принципиально хотелось бы обойтись только xpath. потому что может так случиться, что не каждый элемент будет иметь атрибут. но каждый элемент будет иметь текстовое содержание
Chern
Как вариант, что то в таком духе:

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
lorien
Не очень понятно, что вам нужно. Вы можете привести *минимальный* HTML и *минимальный* python-код для иллюстрации проблемы? И про pep-8 почитайте.
py.user.next
zlodiak
потому что может так случиться, что не каждый элемент будет иметь атрибут
это как ?
приведи все варианты, которые могут быть
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