Выбор элементов с помощью xpath - PullRequest
0 голосов
/ 25 июня 2019

Итак, новинка в Selenium, но у меня проблемы с выбором нужного элемента на этом сайте. В этом случае я получил x_path с помощью инструмента копирования XPath в Chrome. По сути, я пытаюсь извлечь текст CID (в данном случае 4004) с веб-сайта, но мой код, похоже, не может этого сделать. Любая помощь будет оценена!

Я также пытался использовать метод селектора CSS, но он возвращает ту же ошибку.

chrome_options = Options()  
chrome_options.add_argument("--headless")  
chrome_options.binary_location = '/Applications/Google Chrome   Canary.app/Contents/MacOS/Google Chrome Canary'

driver= webdriver.Chrome()

chem_name = "D008294"
url = "https://pubchem.ncbi.nlm.nih.gov/#query=" + chem_name
driver.get(url)  


elements = driver.find_elements_by_xpath('//*[@id="collection-results-container"]/div/div/div[2]/ul/li/div/div/div/div[2]/div[2]/div[2]/span/a/span/span')

driver.close()

print(elements.text)

На данный момент я получаю сообщение об ошибке: у объекта 'list' нет атрибута 'text'

Ответы [ 4 ]

2 голосов
/ 25 июня 2019

Вот xpath, который вы можете использовать.

//span[.='Compound CID']//following-sibling::a/descendant::span[2]

enter image description here

Почему ваш скрипт не работал: I2 ошибки в вашем коде.

elements = driver.find_elements_by_xpath('//*[@id="collection-results-container"]/div/div/div[2]/ul/li/div/div/div/div[2]/div[2]/div[2]/span/a/span/span')

driver.close() # <== don't close the browser until you are done with all your steps on the browser or elements

print(elements.text) # <== you can not get text from list (python will through error here

Как это исправить:

CID =  driver.find_element_by_xpath("//span[.='Compound CID']//following-sibling::a/descendant::span[2]").text # <== returning the text using find_element (not find_elements)

driver.close()

print(CID) # <== now you can print `CID` though browser closed as the value already stored in variable.
0 голосов
/ 25 июня 2019

enter image description here

xpath: // a [содержит (@href, 'составной')] / span [@ class = 'breakword']/ span

вы можете использовать "href" в качестве ссылки на атрибут, поскольку я заметил, что он имеет уникальное значение для каждого компонента.

Пример: href = "https://pubchem.ncbi.nlm.nih.gov/substance/53790330" href =" https://pubchem.ncbi.nlm.nih.gov/compound/4004"

0 голосов
/ 25 июня 2019

Использование xpath при условии, что chrome всегда не работает должным образом.Сначала вы должны знать, как написать xpath и проверить его на консоли chrome.

см. Эти ссылки, которые помогут вам узнать о xpaths

https://www.guru99.com/xpath-selenium.html

https://www.w3schools.com/xml/xpath_syntax.asp

В этом случае сначала найдите диапазон, содержащий текст составного CID, и перейдите к родительскому диапазону вниз к дочернему a / span / span.что-то вроде // span [содержит (text (), 'составной CID'] / parent :: span / a / span / span.

А также вам нужно найти элемент, который возвращает один элемент и получает из него текст. Если вы используете findelements, то он вернет список элементов, поэтому вам нужно выполнить цикл и получить текст из этих элементов.

0 голосов
/ 25 июня 2019

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

Как это:

for ele in print(elements.text):
    print(ele.text)

Или, если вы хотите сопоставить первый элемент, используйте вместо него функцию driver.find_element_by_xpath.

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