Python и Selenium: невозможно найти конкретный (href) элемент для нажатия - PullRequest
1 голос
/ 29 сентября 2019

Я хочу очистить все данные на этом сайте.

В этой части моего скрипта будет нажата кнопка «поиск», необходимая для получения строк данных, которые я хочуscrape:

from selenium import webdriver
import os
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import pandas as pd
import time
import sys
import re
import requests

#options.add_argument("--headless")

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
base_url = 'https://drugdesign.riken.jp/hERGdb/'
driver.get(base_url)

#click the button that says search
element = driver.find_element_by_css_selector('[name=Structure_Search]').click()

Затем мне нужно нажать на каждый LOT_ID, который приведет меня на страницу типа this , которую я могу очистить с помощью этого кода:

base_url = 'https://drugdesign.riken.jp/hERGdb/compound.php?HGID=HG-0260086'
driver.get(base_url)

## compound information table
hgid = driver.find_element_by_xpath('//tbody/tr/th[contains(.,"HGID")]/following::td[1]')
drug_name = driver.find_element_by_xpath('//tbody/tr/th[contains(.,"Drug_name")]/following::td[1]')
MW = driver.find_element_by_xpath('//tbody/tr/th[contains(.,"MW")]/following::td[1]')
Formula = driver.find_element_by_xpath('//tbody/tr/th[contains(.,"Formula")]/following::td[1]')


## ID relation table
id_table = driver.find_elements_by_xpath('/html/body/div[2]/div/div/div[2]/table[2]/tbody')
for x in id_table:
       print(x.text)


## in vitro assay information table
assay_data = driver.find_elements_by_xpath('/html/body/div[2]/div/div/div[2]/table[3]/tbody')
for x in assay_data:
       print(x.text)

Я не могу понять, как перебрать ВСЕ идентификаторы LOT_ID на сайте (например, на странице отображается только 10, и, кажется,> 300 000 результатов, но отображается только 1000).Таким образом, главный вопрос заключается в том, как мне просмотреть все> 300 000 LOT_ID, которые, как они говорят, являются результатами моего поиска, чтобы я мог запустить в нем вторую часть моего кода (см. Выше) (которая выполняется на каждой отдельной странице).

Я просматривал SO, я пробовал что-то вроде:

#table = driver.find_element_by_css_selector('//*[@id="foo-table"]/tbody/tr[1]/td[3]/a')
#print(table)

и тому подобное, используя XPaths и т. Д., Но я получаю ошибки вроде:

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified
  (Session info: chrome=77.0.3865.90)

Так что есликто-то мог бы заполнить среднюю часть моего кода (я думаю, это должно быть максимум одна или две строки?), который показал бы мне, как перебрать> 300 000 LOT_ID и щелкнуть по ним, чтобы привести меня на страницу, которую я затемцарапина, я был бы признателен.

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Вы можете получить все ссылки, используя и .Код ниже распечатать все 1000 ссылок:

import requests
from bs4 import BeautifulSoup

base_url = "https://drugdesign.riken.jp/hERGdb"    
data = [
  ('smiles_S', ''),
  ('jme_S', ''),
  ('tab_selected', 'tab_S'),
  ('query_type', 'Substructure'),
  ('Target[]', 'hERG'),
  ('Target[]', 'Cav1.2'),
  ('Target[]', 'Nav1.5'),
  ('Target[]', 'Kv1.5'),
  ('Value_type[]', 'IC50'),
  ('Value_type[]', 'inhibition'),
  ('Value_type[]', 'other'),
  ('Assay_type[]', 'binding'),
  ('Assay_type[]', 'patch clamp'),
  ('Assay_type[]', 'other'),
  ('Data_source[]', 'ChEMBL'),
  ('Data_source[]', 'PubChem_CID'),
  ('Data_source[]', 'hERG Central(PubChem_SID)'),
  ('low_MW', ''),
  ('high_MW', ''),
  ('Assay_name', ''),
  ('Structure_Search', 'Search'),
]

response = requests.post(f'{base_url}/result.php', data=data)
lots = BeautifulSoup(response.text, "html.parser").select("a[href^='./compound.php?HGID=']")
for lot in lots:
    url = str(lot['href']).replace("./", "")
    print(f"{base_url}/{url}")
0 голосов
/ 29 сентября 2019

Вот код селена, чтобы получить все 1000 ссылок. Используйте цикл while и повторяйте каждую страницу, чтобы получить ссылку, пока кнопка Next не будет отключена.

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

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
base_url = 'https://drugdesign.riken.jp/hERGdb/'
driver.get(base_url)
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//input[@name='Structure_Search']"))).click()
targeturl=[]
while True:
    elements=WebDriverWait(driver,20).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"#foo-table_filter ~ #foo-table a")))
    for ele in elements:
        targeturl.append(ele.get_attribute('href').replace('./', ''))

    if len(driver.find_elements_by_css_selector("a.paginate_button.next.disabled"))>0:
        break
    nextbutton=driver.find_element_by_css_selector("a.paginate_button.next")
    nextbutton.location_once_scrolled_into_view
    nextbutton.click()

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