Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Data Mining
  • » получить атрибут и содержание тега одновременно [RSS Feed]

#1 Фев. 26, 2014 13:49:11

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

получить атрибут и содержание тега одновременно

помогите пожалуйста получить атрибут и содержание тега без использования циклов 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)

Офлайн

#2 Фев. 26, 2014 14:16:43

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

получить атрибут и содержание тега одновременно

Циклы можно заменить на:

catalogCategories = dict(zip(text, href))



Офлайн

#3 Фев. 26, 2014 14:34:11

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

получить атрибут и содержание тега одновременно

пожалуй, да. но всё таки мне принципиально хотелось бы обойтись только xpath. потому что может так случиться, что не каждый элемент будет иметь атрибут. но каждый элемент будет иметь текстовое содержание

Отредактировано zlodiak (Фев. 26, 2014 14:35:34)

Офлайн

#4 Фев. 26, 2014 14:56:04

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

получить атрибут и содержание тега одновременно

Как вариант, что то в таком духе:

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



Офлайн

#5 Фев. 27, 2014 11:22:50

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

получить атрибут и содержание тега одновременно

Не очень понятно, что вам нужно. Вы можете привести *минимальный* HTML и *минимальный* python-код для иллюстрации проблемы? И про pep-8 почитайте.

Офлайн

#6 Фев. 27, 2014 22:22:47

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

получить атрибут и содержание тега одновременно

zlodiak
потому что может так случиться, что не каждый элемент будет иметь атрибут
это как ?
приведи все варианты, которые могут быть



Офлайн

  • Начало
  • » Data Mining
  • » получить атрибут и содержание тега одновременно[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version