Здесь - это способ получения уникальных значений.Это не работает, если я хочу получить уникальный атрибут.Например:
<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()
), если оно существует.Кроме того, мое решение не работает, если родительские ссылки совпадают.