#python #python-3.x #selenium #web-scraping #beautifulsoup
#python #python-3.x #селен #очистка веб-сайта #beautifulsoup
Вопрос:
Я пытаюсь определить, является ли веб-сайт из списка веб-сайтов веб-магазином или нет.
Кажется, что большинство веб-магазинов имеют:
a
Тег со словом «корзина» в ихhref
li
Тег, присвоенный классу со словом «корзина» в имени класса
Я полагаю, что мне пришлось бы воспользоваться преимуществами регулярных выражений, а затем указать find
методу BeautifulSoup для поиска в HTML-данных этого регулярного выражения в теге a
or li
. Как мне следует поступить по этому поводу?
Пока что приведенный ниже код выполняет поиск в HTML-данных для a
тега с href
ЗНАЧЕНИЕМ ИМЕННО cart.
Код
import re
from bs4 import BeautifulSoup
from selenium import webdriver
websites = [
'https://www.nike.com/',
'https://www.youtube.com/',
'https://www.google.com/',
'https://www.amazon.com/',
'https://www.gamestop.com/'
]
shops = []
driver = webdriver.Chrome('chromedriver')
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument('log-level=3')
with webdriver.Chrome(options=options) as driver:
for url in websites:
driver.get(url)
cart = re.compile('.*cart.*', re.IGNORECASE)
soup = BeautifulSoup(driver.page_source, 'html.parser')
if soup.find('a', href=cart):
shops.append(url)
print('nSHOPS FOUND:')
for shop in shops:
print(shop)
Вывод:
SHOPS FOUND:
https://www.nike.com/
https://www.amazon.com/
Ответ №1:
Вы можете использовать оператор contains * с селекторами атрибутов css, чтобы указать атрибут class, или атрибут href содержит подстроку cart. Объедините эти два (class и href) с синтаксисом Or . ЗАДАЧА: Вы могли бы рассмотреть возможность добавления условий ожидания, чтобы убедиться, что все элементы li
и a
тегов присутствуют первыми.
from bs4 import BeautifulSoup
from selenium import webdriver
websites = [
'https://www.nike.com/',
'https://www.youtube.com/',
'https://www.google.com/',
'https://www.amazon.com/',
'https://www.gamestop.com/'
]
shops = []
driver = webdriver.Chrome('chromedriver')
options = webdriver.ChromeOptions()
options.headless = True
options.add_argument('log-level=3')
with webdriver.Chrome(options=options) as driver:
for url in websites:
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
items = soup.select('a[href*=cart], li[class*=cart]')
if len(items) > 0:
shops.append(url)
print('nSHOPS FOUND:')
for shop in shops:
print(shop)
Комментарии:
1. Спасибо вам за это! Похоже, он работает и с другими веб-сайтами. Один вопрос, он не возвращает ‘GameStop’ в качестве магазина. Однако, после проверки HTML-кода GameStop, там явно есть
li
тег с классом ‘cart` . Интересно, почему это может быть.2. Привет, по какой-то причине я не видел этого ответа. В настоящее время я не могу получить доступ к этому URL. Можете ли вы включить html для этой страницы с помощью pastebin.com . Затем я посмотрю.
3. Выбор правильный, но мне отказано в доступе к этому серверу. Если вы работаете без headless, можете ли вы на самом деле увидеть содержимое страницы с помощью selenium chrome?