Web-scarping, очистка супового набора BeautifulSoup от элементов
Прошу строго не судить, ибо пишу впервые (не только про этот пост, но и код). На днях понадобилось сделать web-scrapper,задача стояла в поиске текста, расположенного в такого рода контейнерах:
<div class="td_name">
Сахарница стекло alpina 10554 14,5x8,5cм </div>
Среди прочего вот такого рода "мусора":
</h1></div>
<a name="anchor300880" id="anchor300880"></a>
<div class="row dark ">
<div class="td_checkbox"><span
class="notice"></span><input class="cookie_checkbox" id="300880" type="checkbox"></div>
<div class="td_img">
</div>
<div class="td_name">
Сахарница стекло alpina 10554 14,5x8,5cм </div>
<div class="td_proizv">alpina(home)</div>
<div class="td_nalich">шт</div>
<div class="td_price">7,75</div>
</div>
<a name="anchor314970" id="anchor314970"></a>
<div class="row ">
<div class="td_checkbox"><span
class="notice"></span><input class="cookie_checkbox" id="314970" type="checkbox"></div>
<div class="td_img">
</div>
<div class="td_name">
Бокал стекло HTXB 180мл </div>
<div class="td_proizv">ANHUI DELI HOUSEHOLD GLASS CO.LTD.</div>
<div class="td_nalich">шт</div>
<div class="td_price">7,23</div>
</div>
<a name="anchor314971" id="anchor314971"></a>
Для этого путем поиска был написан ( возможно из говна и палок, судить вам - пишу впервые ) сей код:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
options = Options()
options.headless = True
browser = webdriver.Firefox(options=options, executable_path=r'C:\Users\User\Downloads\geckodriver.exe')
browser.get('https:// ')
requiredHtml = browser.page_source
soup = BeautifulSoup(requiredHtml, 'html5lib')
div = soup.find_all('div', class_='td_name')
print(div)
Результатом является:
[<div class="td_name">
Сахарница стекло alpina 10554 14,5x8,5cм </div>, <div class="td_name">
Бокал стекло HTXB 180мл </div>, <div class="td_name">
Бокал стекло S6981 200мл </div>, <div class="td_name">
Хотелось бы привести результат к следующему виду:
Сахарница стекло alpina 10554 14,5x8,5cм
Бокал стекло HTXB 180мл
Бокал стекло S6981 200мл
А так же возможно ли вывести значения находящиеся в контейнерах:
<div class="td_price">7,75</div>
Сахарница стекло alpina 10554 14,5x8,5cм 7,75
Бокал стекло HTXB 180мл 7,23
Бокал стекло S6981 200мл 7,23
Заранее благодарен.
Ответы (1 шт):
Судя по структуре html, нужная информация храниться в строках, которые и нужно парсить. Например, на странице две строки с товаром:
html = ' \
'<a name="anchor300880" id="anchor300880"></a>' \
'<div class="row dark ">' \
'<div class="td_checkbox"><span class="notice"></span><input class="cookie_checkbox" id="300880" type="checkbox"></div>' \
'<div class="td_img"></div>' \
'<div class="td_name">Сахарница стекло alpina 10554 14,5x8,5cм</div>' \
'<div class="td_proizv">alpina(home)</div>' \
'<div class="td_nalich">шт</div>' \
'<div class="td_price">7,75</div>' \
'</div>' \
'a name="anchor314970" id="anchor314970"></a>' \
'<div class="row ">' \
'<div class="td_checkbox"><span class="notice"></span><input class="cookie_checkbox" id="314970" type="checkbox"></div>' \
'<div class="td_img"></div>' \
'<div class="td_name">Бокал стекло HTXB 180мл</div>' \
'<div class="td_proizv">ANHUI DELI HOUSEHOLD GLASS CO.LTD.</div>' \
'<div class="td_nalich">шт</div>' \
'<div class="td_price">7,23</div>' \
'</div>' \
'<a name="anchor314971" id="anchor314971"></a>'
Тогда все строки это
rows = soup.find_all('div', class_='row')
Обход найденных строк и запись в массив словарей:
data = []
for row in rows:
name = row.find('div', class_='td_name').get_text(strip=True)
price = row.find('div', class_='td_price').get_text(strip=True)
data.append({'name': name, 'price': price})
Ну, и вывод на печать:
for d in data:
print(f'{d['name']} {d['price']')