получение элементов одного элемента найти список FindALL - PullRequest
3 голосов
/ 05 апреля 2019

Я пытаюсь захватить 3 элемента списка (li) внутри определенного неупорядоченного списка. С помощью функции findALL я могу получить то, что хочу. Однако, хотя возвращаемый список содержит 3 li, все в возвращенном списке findALL воспринимается как 1 элемент.

Я попытался использовать функцию findChild, и она видит 7 элементов. то, что я в точности пытаюсь сделать, - это получить ссылки, чтобы я мог получить их содержимое, а также тексты, содержащиеся в упорядоченном списке, которые у меня есть, используя findALL или findChild или что-либо еще

Это изначально то, что я сделал:

 focus=soup.findAll('ul',{'class':'sub-menu'})
 #output

 #[<ul class="sub-menu">
 #<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
 #item-20588" id="menu-item-20588"><a href="http://www.air- 
 #shows.org.uk/2018/06/uk-airshow-calendar-2019/">UK Airshow Calendar 
 #2019</a></li>
 #<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
 #item-22412" id="menu-item-22412"><a href="http://www.air- 
 #shows.org.uk/2018/07/european-airshow-calendar-2019/">European Airshow 
 #Calendar 2019</a></li>
 #<li class="menu-item menu-item-type-taxonomy menu-item-object-category 
 #menu-item-18245" id="menu-item-18245"><a href="http://www.air- 
 #shows.org.uk/category/display-team-schedule/">Latest Display Team 
 #Dates</a></li>
 #</ul>]

Длина списка равна 1. Однако, используя findChild, я имею следующее:

for i in soup.findChild('ul',{'class':'sub-menu'}):
      print (i)
      print('==='*10)

#output

==============================
#<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
#item-20588" id="menu-item-20588"><a href="http://www.air- 
#shows.org.uk/2018/06/uk-airshow-calendar-2019/">UK Airshow Calendar 
#2019</a></li>
==============================

==============================
#<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
#item-22412" id="menu-item-22412"><a href="http://www.air- 
#shows.org.uk/2018/07/european-airshow-calendar-2019/">European Airshow 
#Calendar 2019</a></li>
==============================

==============================
#<li class="menu-item menu-item-type-taxonomy menu-item-object-category 
#menu-item-18245" id="menu-item-18245"><a href="http://www.air- 
#shows.org.uk/category/display-team-schedule/">Latest Display Team 
#Dates</a></li>
==============================

Все, что я хочу, - это получить URL-адреса в href и тексты в этих 3 упорядоченных списках.

Я ищу что-то вроде этого:

www.air-shows.org.uk/2018/07/european-airshow-calendar-2019
UK Airshow Calendar 2019

www.air-shows.org.uk/2018/07/european-airshow-calendar-2019
European Airshow Calendar 2019

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Вот, пожалуйста.

from bs4 import BeautifulSoup
html='''
<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
item-20588" id="menu-item-20588"><a href="http://www.air- 
shows.org.uk/2018/06/uk-airshow-calendar-2019/">UK Airshow Calendar 2019</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
item-22412" id="menu-item-22412"><a href="http://www.air- 
shows.org.uk/2018/07/european-airshow-calendar-2019/">European Airshow Calendar 2019</a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category 
menu-item-18245" id="menu-item-18245"><a href="http://www.air- 
shows.org.uk/category/display-team-schedule/">Latest Display Team Dates</a></li>'''

soup=BeautifulSoup(html,"html.parser")
for item in soup.find_all('a',href=True):
    print("link : " + item['href'])
    print("text : " + item.text)
1 голос
/ 05 апреля 2019

Вы также можете использовать следующее (я предполагаю, что на реальной странице у вас нет \ n в тексте или hrefs. Это также предполагает списки одинаковой длины, сгенерированные из .sub-menu li,.sub-menu a)

from bs4 import BeautifulSoup as bs

html = '''
<html>
 <head></head>
 <body>
  <ul class="sub-menu"> 
   <li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
 item-20588" id="menu-item-20588"><a href="http://www.air- 
 shows.org.uk/2018/06/uk-airshow-calendar-2019/">UK Airshow Calendar 2019</a></li> 
   <li class="menu-item menu-item-type-post_type menu-item-object-post menu- 
 item-22412" id="menu-item-22412"><a href="http://www.air- 
 shows.org.uk/2018/07/european-airshow-calendar-2019/">European Airshow Calendar 2019</a></li> 
   <li class="menu-item menu-item-type-taxonomy menu-item-object-category 
 menu-item-18245" id="menu-item-18245"><a href="http://www.air- 
 shows.org.uk/category/display-team-schedule/">Latest Display Team Dates</a></li> 
  </ul>
 </body>
</html>
 '''

soup = bs(html, 'lxml')

all_items = soup.select('.sub-menu li,.sub-menu a')
events = [item.text for item in all_items[0::2]]
links = [item['href'] for item in all_items[1::2]]
print(events, links)
...