2017-01-12 11 views
0

Я только начинаю изучать python и bs4. И я пытаюсь разобрать HTML-страницы выглядит следующим образом:Метод поиска BeautifulSoup возвращает элемент тега, но строка вызова get 'NoneType' Error

.... 
<p class="result-info"> 
    <span class="result-meta"> 
     <span class="result-price">$1895</span> 
     <span class="result-hood"> address1 </span> 
    </span> 
    .... 

Мой питон код, как показано ниже:

soup = BeautifulSoup(allResponse.content) 
    resultInfoTags = soup.find_all("p", class_="result-info") 
    infoList = [] 
    for infoTag in resultInfoTags: 
     infoDS = {} 
     infoDS['detail_link'] = infoTag.find("a")['href'] 
     for metaData in infoTag.find_all("span", class_="result-meta"): 
      firstSpan = metaData.find("span"); 
      infoDS['price'] = firstSpan.string 
      lala = metaData.find("span", class_="result-hood") 
      infoDS['area'] = lala.string 
     infoList.append(infoDS) 

Ошибка происходит на линии infoDS['area'] = lala.string. Он жалуется

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

Но когда я типа (Лала) печати, это показывает, что Лала является <class 'bs4.element.Tag'>. Когда я печатаю Лала сама по себе, она показывает весь текст по тегу

<span class="result-hood"> (address1)</span>

Я смущен, потому что я использую ту же идею, чтобы получить firstSpan и он не имеет никаких ограничений для вывода правой строки $ 1895. Но это не работает для лалы ... Я потратил пару часов, чтобы отчаянно исследовать и искать в Интернете, но ничего не нашел полезного ...

Любое предложение или подсказка были бы оценены!

+0

опубликовать все html-код, пожалуйста –

ответ

0

Я не уверен на 100%, если это проблема с вашим кодом, но я думаю, что способ, которым вы фактически получаете данные из классов, неверен. Обычно, когда я использую прекрасный суп для поиска определенного класса, я использую другой метод, который у вас есть. Например, я бы использовал следующий метод: variable = soup.find(attrs={"class": class_name_here}), а затем variable = variable.getText().

Поэтому в вашем случае попробуйте следующее:

soup = BeautifulSoup(allResponse.content) 
resultInfoTags = soup.find_all(attrs={"class":"result-info"}) 
infoList = [] 
for infoTag in resultInfoTags: 
    infoDS = {} 
    infoDS['detail_link'] = infoTag.find('a', href=True) 
    for metaData in infoTag.find_all(attrs={"class":"result-meta"}): 
     firstSpan = metaData.find(attrs={"class":"result-price"}) 
     infoDS['price'] = firstSpan.getText() 
     lala = metaData.find(attrs={"class":"result-hood"}) 
     infoDS['area'] = lala.getText() 
    infoList.append(infoDS) 

Опять же, я не уверен, если это то, что происходит в вашей программе так, дайте мне знать, если нет.

+0

Это не работает. Я заменяю 'metaData.find (" span ", class _ =" result-hood ")' на ваш формат 'find (attrs = {" class ":" result-hood "})' он все еще жалуется 'AttributeError: 'NoneType' объект не имеет атрибута «getText» ... Наша другая реализация должна работать одинаково. Я узнал формат 'class_' с официального сайта bs4 – user3335072

0

Я, к счастью, сегодня выяснил тонны экспериментов. Если вы столкнулись с той же проблемой, добавьте не проверку if lala is not None перед тем, как строка infoDS['area'] = lala.getText() решит проблему. Хотя проверка не имеет смысла там, я до сих пор не знаю, почему нет проверки, которая повлияет на код, если есть реальное значение с lala. Если вы знаете, почему, пожалуйста, оставьте здесь решение/объяснение. Очень ценю!