isinstance некорректно работает с BeautifulSoup(NameError)

Я использую isinstance для выбора некоторых html-тегов и передачи их функции Beautifulsoup. Проблема в том, что я продолжаю получать ошибки NameErrors из того, что должно быть идеально исполняемым кодом.

def horse_search(tag):
    return (tag.has_attr('href') and isinstance(tag.previous_element, span))

...

for tag in soup.find_all(horse_search):
   print (tag)    

NameError: глобальное имя «span» не определено

Также я получаю ошибки из кода примера в документации Beautifulsoup, используя isinstance в сочетании с tag.previous_element

def surrounded_by_strings(tag):
    return (isinstance(tag.next_element, NavigableString)
            and isinstance(tag.previous_element, NavigableString))

for tag in soup.find_all(surrounded_by_strings):
    print tag.name

NameError: глобальное имя «NavigableString» не определено

Что может быть не так? Спасибо!


person user3146384    schedule 17.02.2014    source источник
comment
чего вы пытаетесь достичь, используя эти вызовы isinstance? также покажите свой импорт   -  person Guy Gavriely    schedule 17.02.2014
comment
Импорт из bs4 импортирует BeautifulSoup, импортирует запросы, импортирует повторно, импортирует время и импортирует случайным образом. Я хочу изолировать теги, содержащие нужную мне строку. Из всех тегов ‹a› мне нужны лишь несколько, и все они являются потомками тега span.   -  person user3146384    schedule 17.02.2014


Ответы (1)


чтобы найти все привязки, у которых есть родительский элемент span и атрибут href:

for span in soup.find_all('span'):
    for a in span.find_all('a'):
        if a.has_attr('href'):
            print a['href']

однако, хотя это хорошо, как и в большинстве случаев, использование какого-либо инструмента, поддерживающего xpath, может быть еще лучше, например, с помощью lxml и xpath ваш код может выглядеть так же аккуратно, как:

from lxml import etree
etree.parse(url, etree.HTMLParser()).xpath('//span/a/@href')
person Guy Gavriely    schedule 17.02.2014
comment
К сожалению для меня, это не отвечает на вопрос (что может быть не так, т. е. почему здесь выдаются ошибки NameErrors). - person dpb; 02.10.2016