Я пытаюсь удалить данные со страницы, где все элементы хранятся вот так
<div class = "box browsingitem canBuy 123"> </div>
<div class = "box browsingitem canBuy 264"> </div>
Их сотни, но когда я пытаюсь добавить их в массив, сохраняется только 24
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import re
import lxml
my_url = 'https://www.alza.co.uk/tablets/18852388.htm'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "lxml")
classname = "box browsingitem"
containers = page_soup.find_all("div", {"class":re.compile(classname)})
#len(containers) will be equal to 24
for container in containers:
title_container = container.find_all("a",{"class":"name browsinglink"})
product_name = title_container[0].text
print("product_name: " + product_name)
Это проблема с re.compile? Как еще я мог искать классы?
Спасибо за помощь
Если все эти элементы содержат имена классов box browsingitem
, почему бы просто не сделать page_soup.find_all('div', 'box browsingitem')
. Это должно получить все элементы этого класса, загруженные в DOM.
@taras это так, но он загружает, например, 24, даже когда есть 18 элементов ... действительно странно
@ Стивен почему-то не работает, загружает 0
Можете ли вы предоставить ссылку, которую пытаетесь очистить? @Blayss
@Steven Отредактировал сообщение
Таким образом, в этом случае при посещении страницы в DOM загружается только 24 элемента. Мне приходят в голову два варианта: 1) использовать браузер без заголовка, чтобы щелкнуть кнопку «загрузить больше» и загрузить больше элементов в DOM, или 2) создать простую схему разбивки на страницы и просмотреть эти страницы в цикле.
Вот пример второго варианта:
for page in range(0, 10):
print("Trying page # {}".format(page))
if page == 0:
my_url = 'https://www.alza.co.uk/tablets/18852388.html'
else:
my_url = 'https://www.alza.co.uk/tablets/18852388-p{}.html'.format(page)
requests.get(my_url)
page_html = requests.get(my_url)
page_soup = soup(page_html.content, "lxml")
items = page_soup.find_all('div', {"class": "browsingitem"})
print("Found a total of {}".format(len(items)))
for item in items:
title = page_soup.find('a', 'browsinglink')
Вы можете видеть, что URL-адреса имеют встроенную информацию о разбиении на страницы, поэтому все, что вам нужно сделать, это определить, сколько страниц вы хотите очистить, и вы можете сохранить всю эту информацию. Вот результат:
Trying page # 0
Found a total of 24
Trying page # 1
Found a total of 24
Trying page # 2
Found a total of 24
Trying page # 3
Found a total of 24
Trying page # 4
Found a total of 24
Trying page # 5
Found a total of 24
Trying page # 6
Found a total of 24
Trying page # 7
Found a total of 24
Trying page # 8
Found a total of 17
Trying page # 9
Found a total of 0
Возможно ли, что эти сотни загружаются при прокрутке?