Не могу нажимать кнопки, используя Selenium - PullRequest
0 голосов
/ 04 января 2019

Согласно Невозможно получить данные с pantip.com , я пытался получить данные с pantip.com, включая все комментарии и ответы на каждый комментарий.

enter image description here

У меня проблема с получением ответа на каждый комментарий.Я использую селен, чтобы нажать на кнопку, чтобы получить текст внутри.Однако это работает, только если я прокручиваю страницу до местоположения кнопки.

Если я не прокручиваю, возникает ошибка.

WebDriverException: unknown error: Element <a href="javascript:void(0)" class="reply see-more">...</a> is not clickable at point (518, 507). Other element would receive the click: <select class="dropdown-jump">...</select>
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387),platform=Windows NT 10.0.17134 x86_64)

Есть ли способ получить данныевнутри?Нужно ли прокручивать до кнопок?Пожалуйста, предложите мне.

import requests
import re
from bs4 import BeautifulSoup
from selenium import webdriver

chrome_path = r"C:\Users\user\Downloads\chromedriver_win32\chromedriver.exe"
url='https://pantip.com/topic/38372443'
driver = webdriver.Chrome(chrome_path)
driver.get(url)

content=driver.page_source
soup=BeautifulSoup(content,'lxml')  

#Click all buttons
for div in soup.find_all("div", id = lambda value: value and value.startswith("reply-comment-")):
    xPath =  '''//*[@id="''' + str(div['id']) + '''"]/a''' 
    button = driver.find_element_by_xpath(xPath).click()


# Get all comments   
text = list()    
for div in soup.find_all("div", id = lambda value: value and value.startswith("comment-")):
    if len(str(div.text).strip()) > 1:
        text.append(str(div.text).strip())
driver.quit()

Ответы [ 3 ]

0 голосов
/ 04 января 2019

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

  • прокрутите до нужной кнопки
  • прокрутите немного вниз
  • нажмите кнопку, чтобы увидеть ответ

    from selenium.webdriver.common.keys import Keys
    
    for reply in driver.find_elements_by_xpath('//div[starts-with(@id, "reply-comment-")]/a'):
        driver.execute_script('arguments[0].scrollIntoView();', reply)
        reply.send_keys(Keys.DOWN)
        reply.click()
    
0 голосов
/ 04 января 2019

Чтобы нажать на каждую кнопку комментарий и извлечь текст ответа для каждого комментария, который вам не нужен Beautiful Soup и Selenium достаточно.Для этого вам необходимо прокрутить требуемый элемент в Окно просмотра , и вы можете использовать следующее решение:

  • Кодовый блок:

    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 as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver= webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://pantip.com/topic/38372443")
    comment_buttons = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a.reply.see-more span.focus-txt")))
    for button in comment_buttons:
        driver.execute_script("return arguments[0].scrollIntoView(true);", button)
        button.click()
        print("Comment button clicked")
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class^='comment'][data-refcm^='comment'] div.display-post-story>a"))).get_attribute("innerHTML"))
    driver.quit()
    
  • Выход на консоль:

    Comment button clicked
    Comment button clicked
    Comment button clicked
    Comment button clicked
    https://www.instagram.com/clintbondad
    .
    .
    .
    
0 голосов
/ 04 января 2019

Селен может выполнить сценарий с execute_script("xxxx"), например:

script = """function getComments(){var comments=new Array();a = $('div.display-post-story');for (var i=0;i<a.length;i++){comments.push(a[i].innerText)};return comments;}"""
comments = driver.execute_script(script)
# then u can deal with all comments.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...