Selenium — невозможность щелкнуть ссылки в результатах поиска

#python #python-3.x #selenium

#python #python-3.x #selenium

Вопрос:

Я использую Selenium плюс python для поиска по ключевому слову, а затем в результатах поиска пытаюсь щелкнуть 5 лучших URL-адресов и получить данные из тега p, а затем вернуться назад. Итак, в основном я сохраняю данные с этих 5 сайтов. Но почему-то после поиска по ключевому слову я не могу щелкнуть URL-адреса и получить данные. я не знаю, что не так. Это код, который я написал. Пожалуйста, помогите.

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome(executable_path="E:chromedriverchromedriver.exe")
driver.get("https://www.google.com/")
print(driver.title)

driver.maximize_window()
time.sleep(2)

driver.find_element(By.XPATH, "//input[@name='q']").send_keys('selenium')
driver.find_element(By.XPATH, "//div[@class='FPdoLc tfB0Bf']//input[@name='btnK']").send_keys(Keys.ENTER)

a = driver.find_elements_by_xpath("//div[@class='g']/a[@href]")
links = []
for x in a:
    links.append(x.get_attribute('href'))
    link_data = []
for new_url in links:
    print('new url : ', new_url)
    driver.get(new_url)
    link_data.append(driver.page_source)

    b = driver.find_elements(By.TAG_NAME, "p")
    for data in b:
        print(data.text)

    driver.back()
    driver.close()
 

Редактировать :
При навигации по ссылкам он также включает ссылки из «Люди также спрашивают». я не хочу перемещаться по этому окну. Как я могу это сделать?
введите описание изображения здесь

Комментарии:

1. к вашему сведению, после некоторого запроса Google заблокирует или выдаст ошибку captcha

Ответ №1:

Если вы хотите использовать ссылки 16 или около того.

 driver.get("https://www.google.com/")
print(driver.title)

driver.maximize_window()
time.sleep(2)

driver.find_element(By.XPATH, "//input[@name='q']").send_keys('selenium')
driver.find_element(By.XPATH, "//input[@name='btnK']").send_keys(Keys.ENTER)

a = driver.find_elements_by_xpath("//div[@class='g']/div/div/a")
links = []
for x in a:
    links.append(x.get_attribute('href'))
    link_data = []
for new_url in links:
    print('new url : ', new_url)
    driver.get(new_url)
    link_data.append(driver.page_source)

    b = driver.find_elements(By.TAG_NAME, "p")
    for data in b:
        print(data.text)

    driver.back()
 

Комментарии:

1. Также у меня есть сомнения при навигации по ссылкам, которые также включают ссылки «Люди также спрашивают». я не хочу это включать. я отредактировал свой вопрос. как я могу это сделать?

Ответ №2:

У вас неправильный xpath для ссылок, должно быть:

 "//div[@class='yuRUbf']/a[@href]"
 

Если вы посмотрите на соответствующую часть кода, вы увидите <a> , что тег не является дочерним элементом <div class="g"> , а <div class="yuRUbf">

 <div class="g"><!--m-->
    <div class="tF2Cxc" data-hveid="CAkQAA" data-ved="2ahUKEwjphfjOoazuAhUO1VkKHVSkA_oQFSgAMAp6BAgJEAA">
        <div class="yuRUbf"><a href="https://www.healthline.com/nutrition/selenium-benefits"
                               data-ved="2ahUKEwjphfjOoazuAhUO1VkKHVSkA_oQFjAKegQICRAC"
                               ping="/url?sa=tamp;amp;source=webamp;amp;rct=jamp;amp;url=https://www.healthline.com/nutrition/selenium-benefitsamp;amp;ved=2ahUKEwjphfjOoazuAhUO1VkKHVSkA_oQFjAKegQICRAC"><br>
            <h3 class="LC20lb DKV0Md"><span>7 Science-Based Health Benefits of Selenium - Healthline</span></h3>
            <div class="TbwUpd NJjxre"><cite class="iUh30 Zu0yb qLRx3b tjvcx">www.healthline.com<span
                    class="dyjrff qzEoUe"><span> › nutrition › selenium-benefits</span></span></cite></div>
        </a>
            ...
        </div>
    </div>
</div>
 

Вы также можете немного изменить свои строки поиска, но это не меняет общего эффекта:

 driver.find_element_by_xpath("//input[@name='q']").send_keys('selenium', Keys.ENTER)
 

Комментарии:

1. Спасибо, приятель, также я сомневаюсь, что при навигации по ссылкам он также включает ссылки «Люди также спрашивают». я не хочу это включать. я отредактировал свой вопрос. как я могу это сделать?

2. Попробуйте это в качестве вашего xpath ""//div[@id='center_col']//div[@class='yuRUbf']/a[@href]" , могут быть более эффективные / безопасные способы сделать это, я не эксперт в xpath.

3. Кто-нибудь знает, почему используется эта конкретная строка 'yuRUbf' ? Это что-то значит или это просто набор случайных символов?