Соскабливание URL-адресов в красивом супе, но не получение всех ссылок

#python #web-scraping #beautifulsoup

Вопрос:

Это соответствующая часть html, которая очищается:

 <div class="blockSpoiler-content">
   <div class="contentSpoiler">
      <div class="link-box" id="62H" style="background-color: rgb(65, 120, 50);">
         <div class="status-box"><i class="working" title="Working"></i></div>
         <a rel="external" href="https://url1.net.html" target="_blank">Link1</a>
      </div>
      <div class="link-box" id="IFA" style="background-color: rgb(65, 120, 50);">
         <div class="status-box"><i class="working" title="Working"></i></div>
         <a rel="external" href="https://url2.net.html" target="_blank">Link2</a>
      </div>
      <div class="link-box" id="ruG" style="background-color: rgb(65, 120, 50);">
         <div class="status-box"><i class="working" title="Working"></i></div>
         <a rel="external" href="https://url3.com.html" target="_blank">Link3</a>
      </div>
      <div class="link-box" id="Bdf" style="background-color: rgb(65, 120, 50);">
         <div class="status-box"><i class="working" title="Working"></i></div>
         <a rel="external" href="https://url4.com" target="_blank">Link4</a>
      </div>
      <div class="link-box" id="1Da" style="background-color: rgb(65, 120, 50);">
         <div class="status-box"><i class="working" title="Working"></i></div>
         <a rel="external" href="https://url5.net.html" target="_blank">Link5</a>
      </div>
   </div>
</div> 

Я пытаюсь получить эти URL-адреса:

  1. https://url1.net.html
  2. https://url2.net.html
  3. https://url3.com.html
  4. https://url4.com
  5. https://url5.net.html

Я пробовал разные вещи, но дошел только до этого (локальный файл используется только для тестирования, перед очисткой веб-страниц).:

 with open("mainLocalFile.html") as fp:
soup2 = BeautifulSoup(fp, 'html.parser')
links = soup2.find_all('div', class_='blockSpoiler-content')
# print(links)
for link in links:
    print(link)
    print(link.a)          # prints only the first tag
    print(link.a['href'])  # prints only the first URL
 

Ответ №1:

Выберите все <a> , которые находятся под тегом с классом blockSpoiler-content (теперь вы выбираете только один <div class=blockSpoiler-content> с .find_all помощью метода).:

 for a in soup.select(".blockSpoiler-content a"):
    print(a["href"])
 

С принтами:

 https://url1.net.html
https://url2.net.html
https://url3.com.html
https://url4.com
https://url5.net.html