Неверный селектор: результат выражения xpath "//a[contains(@href,'http://twitter.com/')]/@href": [object Attr] получает URL с RSelenium

r selenium xpath rselenium xpath-1.0

16 просмотра

2 ответа

Я пытаюсь собрать URL-адреса с веб-страницы с помощью Rselenium, но получаю сообщение об ошибке InvalidSelector

Используйте R 3.6.0 на ПК с Windows 10, Rselenium 1.7.5 с веб-драйвером Chrome (chromever = "75.0.3770.8")


library(RSelenium)

rD <- rsDriver(browser=c("chrome"), chromever="75.0.3770.8")
remDr <- remoteDriver(port = 4567L, browserName = "chrome")
remDr$open()

url <- "https://www.aph.gov.au/Senators_and_Members/Parliamentarian_Search_Results?q=&mem=1&par=1&gen=0&ps=96"
remDr$navigate(url)

tt <- remDr$findElements(using = "xpath", "//a[contains(@href,'http://twitter.com/')]/@href")

Я ожидаю, чтобы собрать URL-адреса в учетные записи Twitter политиков в списке. Вместо этого я получаю следующую ошибку:

Селен сообщение:

invalid selector: The result of the xpath expression "//a[contains(@href,'http://twitter.com/')]/@href" is: [object Attr]. It should be an element.
  (Session info: chrome=75.0.3770.80)
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/invalid_selector_exception.html
Build info: version: '4.0.0-alpha-1', revision: 'd1d3728cae', time: '2019-04-24T16:15:24'
System info: host: 'ALEX-DELL-17', ip: '10.0.75.1', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_191'
Driver info: driver.version: unknown

Ошибка: Сводка: InvalidSelector Detail: Аргумент был недействительным селектором (например, XPath / CSS). class: org.openqa.selenium.InvalidSelectorException Дополнительные сведения: запустите метод errorDetails

Когда я делаю похожий поиск очень специфического элемента, все работает нормально, пример:

tt <- remDr$findElement(value = '//a[@href = "http://twitter.com/AlboMP"]')

затем

tt$getElementAttribute('href') 

возвращает мне URL мне нужно

Что я делаю неправильно?

Автор: Alex Источник Размещён: 13.06.2019 10:49

Ответы (2)


0 плюса

Это сообщение об ошибке ...

invalid selector: The result of the xpath expression "//a[contains(@href,'http://twitter.com/')]/@href" is: [object Attr]. It should be an element.

...... подразумевает, что ваше выражение XPath не было допустимым.

выражение:

//a[contains(@href,'http://twitter.com/')]/@href

не возвращает элемент. Это вернул бы [object Attr]. Хотя это было приемлемо при использовании, Selenium RCно методы интерфейса WebDriver WebElement требуют объект элемента, а не просто какой-либо объект узла DOM.

Подводя итог, Selenium по- прежнему не поддерживает этот формат. и чтобы решить эту проблему, вам нужно изменить разметку HTML, чтобы обернуть текстовый узел внутри элемента, например a.


Решение

Чтобы решить эту проблему, вам нужно использовать findElementsи создать список :

findElements(value = '//a[@href = "http://twitter.com/AlboMP"]')

Теперь вы можете перебирать список и с помощью getElementAttribute('href')метода извлекать URL-адреса.


Ссылка

InvalidSelectorError: Результат выражения xpath: [текст объекта]

Автор: DebanjanB Размещён: 13.06.2019 09:51

0 плюса

Я ничего не имею о R, поэтому выкладываю ответ с python. Поскольку этот пост о R, я изучил некоторые основы R и опубликовал его тоже.

Самый простой способ получить URL Twitter - это перебрать все URL на веб-странице и проверить, содержит ли он «twitter».

В Python (который работает абсолютно нормально):

driver.get('https://www.aph.gov.au/Senators_and_Members/Parliamentarian_Search_Results?q=&mem=1&par=1&gen=0&ps=96')
links = driver.find_elements_by_xpath("//a[@href]")
for link in links:
    if 'twitter' in link.get_attribute("href"):
        print(link.get_attribute("href")

Результат:

http://twitter.com/AlboMP http://twitter.com/SharonBirdMP
http://twitter.com/Bowenchris http://twitter.com/tony_burke
http://twitter.com/lindaburneymp http: // twitter .com / Mark_Butler_MP
https://twitter.com/terrimbutler http://twitter.com/AnthonyByrne_MP
https://twitter.com/JEChalmers http://twitter.com/NickChampionMP
https://twitter.com/LMChesters http : //twitter.com/JasonClareMP
https://twitter.com/SharonClaydon
https://www.twitter.com/LibbyCokerMP
https://twitter.com/JulieCollinsMP http://twitter.com/fitzhunter
http: // twitter.com/stevegeorganas https://twitter.com/andrewjgiles
https://twitter.com/lukejgosling https://www.twitter.com/JulianHillMP http://twitter.com/stephenjonesalp https://twitter.com/gedkearney
https://twitter.com/MikeKellyofEM http://twitter.com/mattkeogh
http: / /twitter.com/PeterKhalilMP http://twitter.com/CatherineKingMP
https://twitter.com/MadeleineMHKing https://twitter.com/ALEIGHMP
https://twitter.com/RichardMarlesMP
https://twitter.com/ brianmitchellmp
http://twitter.com/#!/RobMitchellMP
http://twitter.com/ShayneNeumannMP https://twitter.com/ClareONeilMP
http://twitter.com/JulieOwensMP
http://www.twitter.com/ GrahamPerrettMP
http://twitter.com/tanya_plibersek http://twitter.com/AmandaRishworth http://twitter.com/MRowlandMP https://twitter.com/JoanneRyanLalor
http://twitter.com/billshortenmp http://www.twitter.com/annewerriwa
http://www.twitter.com/stemplemanmp
https : //twitter.com/MThistlethwaite
http://twitter.com/MariaVamvakinou https://twitter.com/TimWattsMP
https://twitter.com/joshwilsonmp

В R: (Это может быть неправильно, но вы можете понять)

library(XML)
library(RCurl)
library(RSelenium)
url <- "https://www.aph.gov.au/Senators_and_Members/Parliamentarian_Search_Results?q=&mem=1&par=1&gen=0&ps=96"
doc <- getURL(url)
parser <- htmlParse(doc)
links <- xpathSApply(parser, "//a[@href]", xmlGetAttr, "href")
for(link in links){
    if(grepl("twitter", link)){
        print(link)
    }
}

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

Автор: Prasanth Ganesan Размещён: 13.06.2019 10:02
Вопросы из категории :
32x32