Определение того, является ли веб-сайт веб-магазином или нет

#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?