очистка данных из следующего диапазона в пределах того же тега h1 в beautifulsoup

#python #web-scraping #beautifulsoup

#python #очистка веб-страниц #beautifulsoup

Вопрос:

Привет, я пытаюсь очистить подкатегорию

 subcat = soup.find(class_='bread-block-wrap').find(class_='breadcrumb-keyword-bg').find(class_='breadcrumb-keyword list-responsive-container').find(class_='ui-breadcrumb').find('h1')
  

и это результат

 <h1>
<a href="//www.aliexpress.com/category/509/cellphones-telecommunications.html" title="Cellphones amp;amp; Telecommunications"> Cellphones amp;amp; Telecommunications</a>
<span class="divider">amp;></span> <span> Mobile Phones</span>
</h1>
  

итак, теперь есть 2 тега диапазона, номер 1 равен

 <span class="divider">amp;></span>
  

и 2-й — это

 <span> Mobile Phones</span>
  

и я хочу очистить этот текст в теге 2-го диапазона, пожалуйста, кто-нибудь может помочь

Ответ №1:

Вы можете использовать функцию find_all(), чтобы получить все теги диапазона в списке, а затем использовать .text атрибут для получения текста.

 subcat.find_all('span')[1].text
  

Должен выводить

  Mobile Phones
  

ДЕМОНСТРАЦИЯ

 from bs4 import BeautifulSoup
html="""
<h1>
<a href="//www.aliexpress.com/category/509/cellphones-telecommunications.html" title="Cellphones amp;amp; Telecommunications"> Cellphones amp;amp; Telecommunications</a>
<span class="divider">amp;></span> <span> Mobile Phones</span>
</h1>
"""
soup=BeautifulSoup(html,'html.parser')
h1=soup.find('h1')
print(h1.find_all('span')[1].text.strip())
  

Вывод

 Mobile Phones
  

Комментарии:

1. Большое спасибо за такой быстрый ответ, можете ли вы помочь мне еще с одной вещью, как мне удалить \ before \xyz.com

2. @MuhammadFaisal Хорошо, теперь я понял ваш вопрос. Вы можете получить правильный URL из href с помощью subcat.find('a')['href'].replace('//','')

Ответ №2:

Вы можете использовать css-селектор n-го типа

 h1 span:nth-of-type(2)
  

т. е.

 items = soup.select("h1 span:nth-of-type(2)")
  

Затем повторите список.

Если возможно только одно совпадение, тогда просто:

 item = soup.select_one("h1 span:nth-of-type(2)")
print(item.text.strip())
  

Ответ №3:

Другим решением было бы использовать CSS-селекторы, которые позволяют вам избавляться от каскадирования снова и снова. В вашем случае это:

 results = soup.select(".bread-block-wrap .breadcrumb-keyword-bg .breadcrumb-keyword.list-responsive-container .ui-breadcrumb h1 span")
  

собирается вернуть два span тега в списке. Затем вы можете просто использовать второй.

У вас, конечно, есть множество других полезных инструментов для работы при выборе CSS-селекторов. Просто найдите чит-лист CSS selector и наслаждайтесь.