Кнопка извлечения текста ссылки с сайта python selenium - PullRequest
1 голос
/ 24 мая 2019

Здесь - это ссылка, для которой я хочу извлечь текст ссылки кнопки, но я не могу этого сделать. После открытия веб-сайта я выбираю один из вариантов «Выбрать продукт».", предположим, что я выбрал первый вариант, т.е." Акриловые покрытия ", затем появилось 3 типа:" Грунтовки "," Промежуточные звенья "," Завершить ", я хочу извлечь их текст, что я не могу сделать.

import requests
from bs4 import BeautifulSoup
driver = webdriver.Chrome('~/chromedriver.exe')

driver.get('http://www.asianpaintsppg.com/applications/protective_products.aspx')
lst_name = ['Acrylic Coatings','Glass Flake Coatings']

for i in lst_name:
    print(i)
    driver.find_element_by_xpath("//select[@name='txtProduct']/option[text()="+"'"+str(i)+"'"+"]").click()
    page = requests.get("http://www.asianpaintsppg.com/applications/protective_products.aspx")
    soup = BeautifulSoup(page.content, 'html.parser')
    for div in soup.findAll('table', attrs={'id':'dataLstSubCat'}):
      print(div.find('a')['href'])

Но я получаю пустые значения здесь.Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

Существуют варианты получения подкатегорий без использования селена.Попробуйте использовать почтовые запросы, как показано ниже.

import requests
from bs4 import BeautifulSoup

url = "http://www.asianpaintsppg.com/applications/protective_products.aspx"

with requests.Session() as s:
    r = s.get(url)
    soup = BeautifulSoup(r.text,"lxml")
    payload = {i['name']: i.get('value', '') for i in soup.select('input[name]')}
    payload['txtProduct'] = '2' #This is the dropdown number
    res = s.post(url,data=payload)
    sauce = BeautifulSoup(res.text,"lxml")
    subcat = [item.text for item in sauce.select("[id^='dataLstSubCat_']")]
    print(subcat)

Вывод, который вы можете получить:

['Primers', 'Intermediates', 'Finishes']
1 голос
/ 24 мая 2019

Вы хотите .text, а не href, а также условие ожидания для обновления страницы:

#dataLstSubCat a

Затем извлеките .text в цикле | понимание

items = [item.text for item in soup.select('#dataLstSubCat a')]

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

items = [item.text for item in  WebDriverWait(driver,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#dataLstSubCat a")))]

Дополнительный импорт:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Вероятно, вы могли бы сделать все это с запросами POST и начальным GET, так как похоже, что страница использует __doPostBack (.aspx), где значение из раскрывающегося списка используется для возврата подэлементов.


from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time

driver = webdriver.Chrome() #'~/chromedriver.exe')
driver.get('http://www.asianpaintsppg.com/applications/protective_products.aspx')

lst_name = ['Acrylic Coatings','Glass Flake Coatings']

for i in lst_name:
    driver.find_element_by_xpath("//select[@name='txtProduct']/option[text()="+"'"+str(i)+"'"+"]").click()
    items = [item.text for item in  WebDriverWait(driver,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#dataLstSubCat a")))]
    print(items)
    time.sleep(2)
0 голосов
/ 24 мая 2019

Используйте следующий код. Это дает мне следующий вывод.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

driver = webdriver.Chrome('~/chromedriver.exe')
driver.get('http://www.asianpaintsppg.com/applications/protective_products.aspx')
lst_name = ['Acrylic Coatings','Glass Flake Coatings']

for i in lst_name:

    driver.find_element_by_xpath("//select[@name='txtProduct']/option[text()="+"'"+str(i)+"'"+"]").click()
    elements=WebDriverWait(driver, 10).until(expected_conditions.presence_of_all_elements_located((By.XPATH, '//table[@id="dataLstSubCat"]//tr//td//a[starts-with(@id,"dataLstSubCat_LnkBtnSubCat_")]')))
    for ele in elements:
        print(ele.text)
...