Почему мое выражение Selenium xpath возвращает [атрибут объекта] вместо элемента? - PullRequest
1 голос
/ 27 июня 2019

Я делаю скребок, который будет проходить через мою веб-страницу и захватывать все ссылки. Многие ссылки находятся в закрытом списке, также известном как дерево. Поэтому я нашел xpath, который содержит все ссылки. Я запустил следующий xpath в google inspect, и он работал совершенно нормально, давая мне следующий вывод.

var result=$x("//div[@id='index__tree']//a[contains(text(),doku.php)]/@href")

result[0].value
"/doku.php?ihome"
result[4].value
"/doku.php?start"

Я передал xpath в код селена:

a = driver.find_elements_by_xpath("//div[@id='index__tree']//a[contains(text(),doku.php)]/@href")

for aa in a:
        print(aa)

Затем я запустил код и получил следующую ошибку:

opening browser
Login Successful
Traceback (most recent call last):
  File "wiki.py", line 49, in <module>
    a = driver.find_elements_by_xpath("//div[@id='index__tree']//a[contains(text(),doku.php)]/@href")
  File "/home/aevans/wikiProject/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 410, in find_elements_by_xpath
    return self.find_elements(by=By.XPATH, value=xpath)
  File "/home/aevans/wikiProject/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 1007, in find_elements
    'value': value})['value'] or []
  File "/home/aevans/wikiProject/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/aevans/wikiProject/venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: The result of the xpath expression "//div[@id='index__tree']//a[contains(text(),doku.php)]/@href" is: [object Attr]. It should be an element.
  (Session info: headless chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.86,platform=Linux 3.10.0-957.12.2.el7.x86_64 x86_64)

1 Ответ

1 голос
/ 27 июня 2019

Попробуйте заменить

a = driver.find_elements_by_xpath("//div[@id='index__tree']//a[contains(text(),doku.php)]/@href")
for aa in a:
    print(aa)

на

a = [elem.get_attribute("href") for elem in driver.find_elements_by_xpath("//div[@id='index__tree']//a[contains(text(),doku.php)]")]

for aa in a:
    print(aa)

Обратите внимание, что я удалил "/ @ href" с конца вашего селектора.

Селектор Selenium долженвернуть веб-элемент.Указав «/ @ href», он возвращает атрибут href этого элемента вместо самого элемента.

Метод get_attribute (attribute_name) возвращает атрибут элемента.Затем вы можете пройти через него.

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