2015-01-05 2 views
3

Я хочу, чтобы найти все ссылки в DIV, например:список питона в рекурсии

<div> 
    <a href="#0"></a> 
    <a href="#1"></a> 
    <a href="#2"></a> 
</div> 

Так я пишу FUNC следующим образом:

def get_links(div): 
    links = [] 
    if div.tag == 'a': 
     links.append(div) 
     return links 
    else: 
     for a in div: 
      links + get_links(a) 
     return links 

почему результаты является [], а не [a, a]? ------- вопрос

Я знаю, что это вопрос ведения списка, не могли бы вы показать какую-нибудь деталь

Это полный модуль: добавление

import lxml.html 


def get_links(div): 
    links = [] 
    if div.tag == 'a': 
     links.append(div) 
     return links 
    else: 
     for a in div: 
      links + get_links(a) 
     return links 


if __name__ == '__main__': 

    fragment = ''' 
     <div> 
      <a href="#0">1</a> 
      <a href="#1">2</a> 
      <a href="#2">3</a> 
     </div>''' 
    fragment = lxml.html.fromstring(fragment) 
    links = get_links(fragment) # <--------------- 
+2

Попробуйте изменить 'ссылки + get_links (а)' 'к ссылкам + = get_links (а)' – vaultah

+0

Если вы не измените 'ссылки ', кто еще должен это делать? – glglgl

+0

Да, это правильный путь. Благодарю. Я хочу написать + =, но я забыл, и я думаю, что пишу + =. поэтому я не нашел ошибку ... и я думаю, что это вопрос списка ссылок – zwidny

ответ

2

Списка в возвратах Python новый список, полученный из конкатенации arugments, не меняет их:

x = [1, 2, 3, 4] 
print(x + [5, 6]) # displays [1, 2, 3, 4, 5, 6] 
print(x)   # here x is still [1, 2, 3, 4] 

вы можете использовать метод extend:

x.extend([5, 6]) 

или же +=

x += [5, 6] 

Последнее IMO немного «странно», потому что это тот случай, когда x=x+y не то же самое, как x+=y и поэтому я предпочитаю, чтобы избежать этого и сделать ин расширение места более явным.

Для кода

links = links + get_links(a) 

также будет приемлемым, но помните, что это делает другое дело: он выделяет новый список с конкатенации, а затем присвоить имя links, чтобы указать на него: он не изменить исходный объект, на который ссылается links:

x = [1, 2, 3, 4] 
y = x 
x = x + [5, 6] 
print(x) # displays [1, 2, 3, 4, 5, 6] 
print(y) # displays [1, 2, 3, 4] 

но

x = [1, 2, 3, 4] 
y = x 
x += [5, 6] 
print(x) # displays [1, 2, 3, 4, 5, 6] 
print(y) # displays [1, 2, 3, 4, 5, 6] 
+0

Да, это правильный путь. Спасибо! Я хочу написать + =, но я забыл, и я думаю, что пишу + =. поэтому я не нашел ошибку ... и я думаю, что это вопрос списка ссылок – zwidny

1

Если тег не является 'а', ваш код выглядит так.

# You create an empty list 

links = [] 
for a in div: 
    # You combine <links> with result of get_links() but you do not assign it to anything 
    links + get_links(a) 
# So you return an empty list 
return links 

Вы должны изменить + с +=:

links += get_links(a) 

Или используйте extend()

links.extend(get_links(a)) 
+0

Да, это правильный путь. Я хочу написать + =, но я забыл, и я думаю, что пишу + =. поэтому я не нахожу ошибки ... и я думаю, что это вопрос списка ссылок. – zwidny

0

Другой вариант заключается в использовании xpath метод, чтобы получить все a теги из div на любом уровне.

Код:

from lxml import etree 
root = etree.fromstring(content) 
print root.xpath('//div//a') 

Выход:

[<Element a at 0xb6cef0cc>, <Element a at 0xb6cef0f4>, <Element a at 0xb6cef11c>] 
+2

Ваш код возвращает только теги 'a', которые являются прямыми дочерними элементами тега' div'. '' // div // a'' лучше. –

+0

@infgeoax: да согласитесь. Обновлен код, чтобы получить теги 'a' с' div' на любом уровне. Thanx. –

Смежные вопросы