python lxml xpath 1.0: уникальные значения для атрибута элемента - PullRequest
0 голосов
/ 16 октября 2018

Здесь - это способ получения уникальных значений.Это не работает, если я хочу получить уникальный атрибут.Например:

<a href = '11111'>sometext</a>
<a href = '11121'>sometext2</a>
<a href = '11111'>sometext3</a>

Я хочу получить уникальные ссылки.Ограничено использованием xpath 1.0

page_src.xpath( '(//a[not(.=preceding::a)] )')
page_src.xpath( '//a/@href[not(.=preceding::a/@href)]' )

возврат дубликатов.Можно ли разрешить этот кошмар с отсутствием unique-values?

UPD: это не то решение, которое я хотел, но я написал функцию python, которая выполняет итерации по родительским элементам и проверяет, не добавляет ли родительский тег фильтры ссылок нанеобходимое количество.

Вот мой пример:

_x_item = (
    '//a[starts-with(@href, "%s")'
    'and (not(@href="%s"))'
    'and (not (starts-with(@href, "%s"))) ]'
    %(param1, param1, param2 ))

#rm double links
neededLinks = list(map(lambda vasa: vasa.get('href'), page_src.xpath(_x_item)))
if len(neededLinks)!=len(list(set(neededLinks))):
    uniqLength = len(list(set(neededLinks)))
    breakFlag = False
    for linkk in neededLinks:
        if neededLinks.count(linkk)>1:
            dupLinks = page_src.xpath('//a[@href="%s"]'%(linkk))
            dupLinkParents = list(map(lambda vasa: vasa.getparent(), dupLinks))
            for dupParent in dupLinkParents:
                tempLinks = page_src.xpath(_x_item.replace('//','//%s/'%(dupParent.tag)))
                tempLinks = list(map(lambda vasa: vasa.get('href'), tempLinks))
                if len(tempLinks)==len(set(neededLinks)):
                    breakFlag = True
                    _x_item = _x_item.replace('//','//%s/'%(dupParent.tag))
                    break
            if breakFlag:
                break

Это БУДЕТ работать, если дублирующиеся ссылки имеют другого родителя, но с тем же значением @href.

В результате я добавлю префикс parent.tag, например //div/my_prev_x_item

. Кроме того, используя python, я могу обновить результат до //div[@key1="val1" and @key2="val2"]/my_prev_x_item, повторяя по dupParent.items().Но это работает, только если элементы не находятся в одном родительском объекте.

В результате мне нужно только x_path_expression , поэтому я не могу просто использовать list(set(myItems)).

Я хочу более простое решение (например, unique-values()), если оно существует.Кроме того, мое решение не работает, если родительские ссылки совпадают.

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете извлечь все ссылки, а затем найти уникальные:

all_hrefs = page_src.xpath('//a/@href')
unique_hrefs = list(set(all_hrefs))
...