2015-06-21 64 views
5

Używam Regex do pobierania pewnych treści z pola wyszukiwania na stronie internetowej pod numerem selenium.webDriver.Python regex AttributeError: Obiekt "NoneType" nie ma atrybutu "group"

searchbox = driver.find_element_by_class_name("searchbox") 
searchbox_result = re.match(r"^.*(?=(\())", searchbox).group() 

Kod działa tak długo, jak pole wyszukiwania zwraca wyniki pasujące do Regex. Ale jeśli pole wyszukiwania odpowiedzi z ciągiem "No results" otrzymuję błąd:

AttributeError: 'NoneType' object has no attribute 'group'

Jak mogę sprawić, że skrypt obsłużyć sytuację "No results"?

Odpowiedz

6

Udało mi się wymyślić to rozwiązanie, miało to związek z neglectin g group() dla sytuacji, w której odpowiedź w polu wyszukiwania to "No results" i tym samym nie pasuje do Regex.

try: 
    searchbox_result = re.match("^.*(?=(\())", searchbox.group() 
except AttributeError: 
    searchbox_result = re.match("^.*(?=(\())", searchbox) 

lub po prostu:

try: 
    searchbox_result = re.match("^.*(?=(\())", searchbox.group() 
except: 
    searchbox_result = None 
3

Kiedy robisz

re.match("^.*(?=(\())", search_result.text) 

wtedy, gdy nie znaleziono dopasowania, None zostaną zwrócone:

Return None if the string does not match the pattern; note that this is different from a zero-length match.

Należy sprawdzić, czy masz wynik przed zastosowaniem group na nim:

res = re.match("^.*(?=(\())", search_result.text) 
if res: 
    # ... 
+0

Dzięki, można nadać bardziej konkretny przykład kodu? Zasadniczo chcę go napisać '' '' do 'res', jeśli nic nie znajdzie. Lub alternatywnie 'pass' jeśli używasz' except'. – Winterflags

+0

@Winterflags Możesz sprawdzić 'res is None', jeśli tak jest, zmień go na' "" '. – Maroun

+0

@Winterflags Zwróć również uwagę, że twoje wyrażenie regularne jest chciwe, pasuje do "abc (def" w następującym ciągu 'abc (def (' Czy to jest to czego chcesz? – Maroun