Beautifulsoup AttributeError: у объекта 'list' нет атрибута 'text' - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий HTML-код:

<div>
    <span class="test">
     <span class="f1">
      5 times
     </span>
    </span>

    </span>
   </div>

<div>

</div>

<div>
    <span class="test">
     <span class="f1">
      6 times
     </span>
    </span>

    </span>
   </div>

Мне удалось перейти по дереву, но при попытке печати я получаю следующую ошибку:

AttributeError: 'list' object has no attribute 'text'

Работает код Python:

x=soup.select('.f1')
print(x) 

дает следующее:

[]
[]
[]
[]
[<span class="f1"> 19 times</span>]
[<span class="f1"> 12 times</span>]
[<span class="f1"> 6 times</span>]
[]
[]
[]
[<span class="f1"> 6 times</span>]
[<span class="f1"> 1 time</span>]
[<span class="f1"> 11 times</span>]

, но print(x.prettify) выдает ошибку выше.Я в основном пытаюсь получить текст между тегами span для всех экземпляров, пустым, когда его нет, и строкой, когда он доступен.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Я бы порекомендовал вам использовать метод .findAll и зацикливать на совпадающих интервалах.

Пример:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for span in soup.findAll("span", class_="f1"):
    if span.text.isspace():
        continue
    else:
        print(span.text)

Метод .isspace() проверяет, является ли строка пустой (проверкаесли строка имеет значение True, то здесь работать не будет, поскольку пустые пробелы html span cointans).

0 голосов
/ 09 октября 2018

select() возвращает список результатов, независимо от того, содержит ли результат 0 элементов.Поскольку объект list не имеет атрибута text, он дает вам AttributeError.

Аналогично, prettify() должен сделать html более читабельным, а не способ интерпретировать list.

. Если вам нужно только извлечь text sкогда доступно:

texts = [''.join(i.stripped_strings) for i in x if i]

# ['5 times', '6 times']

Это удаляет все лишние символы пробела / новой строки в строке и дает вам только пустой текст.Последний if i указывает на возвращение text, только если i не None.

Если вы действительно заботитесь о пробелах / символах новой строки, сделайте это вместо:

texts  = [i.text for i in x if i]

# ['\n      5 times\n     ', '\n      6 times\n     ']
0 голосов
/ 09 октября 2018
from bs4 import BeautifulSoup
html = '''<div>
    <span class="test">
     <span class="f1">
      5 times
     </span>
    </span>
    </span>
   </div>
<div>
</div>
<div>
    <span class="test">
     <span class="f1">
      6 times
     </span>
    </span>
    </span>
   </div>'''


soup = BeautifulSoup(html, 'html.parser')
aaa = soup.find_all('span', attrs={'class':'f1'})
for i in aaa:
    print(i.text)

Выход:

5 times
6 times
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...