def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]
Пример:
>>> a = 'some var'
>>> namestr(a, globals())
['a']
Как @rbright уже указал независимо от того, что Вы делаете существуют, вероятно, лучшие способы сделать это.
Нет, lxml не предоставляет метод «сначала найти или не вернуть», который вы ищете. Просто используйте (выберите (суп) или [Нет]) [0]
, если вам это нужно, или напишите функцию, которая сделает это за вас.
#!/usr/bin/python
import lxml.html
import lxml.cssselect
soup = lxml.html.fromstring("""
<html>
<a href="foo" class="yyy zzz" />
<a href="bar" class="yyy" />
<a href="baz" class="zzz" />
<a href="quux" class="zzz yyy" />
<a href="warble" class="qqq" />
<p class="yyy zzz">Hello</p>
</html>""")
select = lxml.cssselect.CSSSelector("a.yyy.zzz, a.yyy")
print [lxml.html.tostring(s).strip() for s in select(soup)]
print (select(soup) or [None])[0]
Хорошо, поэтому soup.find (' a ')
действительно сначала найдет элемент или None, как и следовало ожидать. Проблема в том, что, похоже, он не поддерживает богатый синтаксис XPath, необходимый для CSSSelector.