BeatifulSoup - Попытка получить текст внутри тегов span

Я хочу вытащить текст внутри тегов span, но когда я пытаюсь использовать .text или get_text (), я получаю ошибки (либо после печати диапазонов, либо в цикле for). Что мне не хватает? Я настроил его только сейчас, чтобы просто сделать это для первого div класса col, просто чтобы проверить, работает ли он, но я хочу, чтобы он работал и для второго.

Спасибо

Мой код -

premier_soup1 = player_soup.find('div', {'class': 'row-table details -bp30'})
premier_soup_tr = premier_soup1.find_all('div', {'class': 'col'})
for x in premier_soup_tr[0]:
    spans = x.find('span')
    print (spans)

Выход

-1
<span itemprop="name">Alisson Ramses Becker</span>
-1
<span itemprop="birthDate">02/10/1992</span>
-1
<span itemprop="nationality"> Brazil</span>
-1
>>> 

HTML

<div class="col">
 <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span>    </strong></p>  
 <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>
 <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>               
  </div>      
 <div class="col">
<p>Club: <span itemprop="affiliation">Liverpool</span></p>
<p>Squad: 13</p><p>Position: Goal Keeper</p>
</div>

person anfield    schedule 30.10.2018    source источник


Ответы (2)


Если вам просто нужен текст в промежутках, вы можете искать специально для промежутков:

soup = BeautifulSoup(html, 'html.parser')
spans = soup.find_all('span')
for span in spans:
    print(span.text)

Если вы хотите найти промежутки с конкретными div, вы можете сделать:

divs = soup.find_all( 'div', {'class': 'col'})
for div in divs:
    spans = div.find_all('span')
    for span in spans:
        print(span.text)

Если вам просто нужны все значения после двоеточия, вы можете выполнить поиск по тегам абзаца:

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all( 'div', {'class': 'col'})
for div in divs:
    ps = div.find_all('p')
    for p in ps:
        print(p.text.split(":")[1].strip())
person Kyle    schedule 30.10.2018
comment
Спасибо. Второе предложение, похоже, дает мне дублированный вывод. См. Ниже Алиссон Рамзес Беккер, 10.02.1992, Бразилия, Ливерпуль, Алиссон Рамзес Беккер, 10.02.1992, Бразилия, Ливерпуль,. Также 2-й div имеет только первую строку в качестве диапазона, который мне нужен, тогда 2-я и 3-я строки содержат только теги p, где мне нужны эти данные. - person anfield; 31.10.2018
comment
Похоже, вам просто нужны значения после двоеточия. В этом случае вы можете просто найти теги абзацев, а затем разделить текст на двоеточие. См. Мою правку в ответе выше. - person Kyle; 01.11.2018

Ответ Кайла хорош, но чтобы не печатать одно и то же значение несколько раз, как вы сказали, произошло, вам нужно немного изменить логику. Сначала вы анализируете и добавляете все найденные совпадения в список, а ЗАТЕМ вы просматриваете список со всеми совпадениями и распечатываете их. Еще одна вещь, которую вам, возможно, придется учитывать, - это проблема:

<div class=col>
  <div class=col>
    <span/>
  </div>
</div>

Используя список вместо печати сразу, вы можете обрабатывать любые совпадения, которые идентичны любым существующим записям в приведенном выше примере html, вы можете увидеть, как диапазон может быть добавлен дважды, с тем, как вы находите совпадения в ответе, предложенном Кайлом. Все дело в том, чтобы убедиться, что вы создаете логику, которая будет находить только те совпадения, которые вам нужны. То, как вы это делаете, часто / всегда зависит от форматирования html, но также важно проявлять творческий подход! Удачи.

person heap1    schedule 01.11.2018
comment
Спасибо за Ваш ответ. Можете ли вы привести пример того, как я бы сразу использовал список? Теперь у меня есть то, что мне нужно. В основном получил промежутки от div1 + div 2 в одном цикле, затем перешел к следующему div и получил теги p, и удалил текст (с помощью ответа kyles). Когда я нахожу все, присваиваю это строке s и проверяю тип, он имеет тип ‹class 'bs4.element.ResultSet'›. Например, spans = div.find_all ('span') теперь является списком или мне нужно сделать что-то еще, чтобы сделать его правильным списком? - person anfield; 01.11.2018