Как извлечь названия продуктов с сайта с помощью Selenium Python - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь удалить заголовок с веб-сайта, но он возвращает только 1 заголовок. Как я могу получить все названия?

Ниже приведен один из элементов, которые я пытаюсь получить, используя xpath (начинается с):

<div id="post-4550574" class="post-box    " data-permalink="https://hypebeast.com/2019/4/undercover-nike-sfb-mountain-sneaker-release-info" data-title="The UNDERCOVER x Nike SFB Mountain Pack Gets a Release Date"><div class="post-box-image-container fixed-ratio-3-2">

Это мой текущий код:

from selenium import webdriver
import requests
from bs4 import BeautifulSoup as bs

driver = webdriver.Chrome('/Users/Documents/python/Selenium/bin/chromedriver')
driver.get('https://hypebeast.com/search?s=nike+undercover')

element = driver.find_element_by_xpath(".//*[starts-with(@id, 'post-')]")
print(element.get_attribute('data-title'))

Выход: The UNDERCOVER x Nike SFB Mountain Pack Gets a Release Date

Я ожидал намного большего заголовка, но возвращал только один результат.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Чтобы извлечь названия продуктов с веб-сайта , так как желаемыми элементами являются JavaScript включенные элементы, вам нужно вызвать WebDriverWait для visibility_of_all_elements_located() и вы можете использовать любой из следующих Стратегий локатора :

  • XPATH

    driver.get('https://hypebeast.com/search?s=nike+undercover')
    print([element.text for element in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//h2/span")))])
    
  • CSS_SELECTOR:

    driver.get('https://hypebeast.com/search?s=nike+undercover')
    print([element.text for element in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "h2>span")))])
    
  • Выход на консоль:

    ['The UNDERCOVER x Nike SFB Mountain Pack Gets a Release Date', 'The UNDERCOVER x Nike SFB Mountain Surfaces in "Dark Obsidian/University Red"', 'A First Look at UNDERCOVER’s Nike SFB Mountain Collaboration', "Here's Where to Buy the UNDERCOVER x Gyakusou Nike Running Models", 'Take Another Look at the Upcoming UNDERCOVER x Nike Daybreak', "Take an Official Look at GYAKUSOU's SS19 Footwear and Apparel Range", 'UNDERCOVER x Nike Daybreak Expected to Hit Shelves This Summer', "The 10 Best Sneakers From Paris Fashion Week's FW19 Runways", "UNDERCOVER FW19 Debuts 'A Clockwork Orange' Theme, Nike & Valentino Collabs", 'These Are the Best Sneakers of 2018']
    
1 голос
/ 11 апреля 2019

Вам не нужен селен. Вы можете использовать requests, что быстрее, и нацелиться на атрибут data-title

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://hypebeast.com/search?s=nike+undercover')
soup = bs(r.content, 'lxml')
titles = [item['data-title'] for item in soup.select('[data-title]')]
print(titles)

Если вы хотите, чтобы синтаксис соответствия селена был

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://hypebeast.com/search?s=nike+undercover')
titles = [item.get_attribute('data-title') for item in driver.find_elements_by_css_selector('[data-title]')]
print(titles)   
0 голосов
/ 11 апреля 2019

Если локатор находит несколько элементов, то find_elemnt возвращает первый элемент. find_elements возвращает список всех элементов, найденных локатором.
Затем вы можете перебрать список и получить все элементы.

Если все элементы, которые вы пытаетесь найти, имеют класс post-box, тогда вы можете найти элементы по имени класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...