Использование селектора XPath 'following-sibling:: text ()' в Selenium (Python)
Я пытаюсь использовать Selenium (в Python) для извлечения некоторой информации с веб-сайта. Я выбирал элементы с XPaths, но у меня возникли проблемы с использованием следующего селектора. HTML выглядит следующим образом:
<span class="metadata">
<strong>Photographer's Name: </strong>
Ansel Adams
</span>
Я могу выбрать "имя фотографа" с
In [172]: metaData = driver.find_element_by_class_name('metadata')
In [173]: metaData.find_element_by_xpath('strong').text
Out[173]: u"Photographer's Name:"
Я пытаюсь выбрать раздел текста после тега ('Ansel Adams' в Примере). Я предположил, что могу использовать следующий селектор-sibling, но я получаю следующее ошибка:
In [174]: metaData.find_element_by_xpath('strong/following-sibling::text()')
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (328, 0))
... [NOTE: Omitted the traceback for brevity] ...
InvalidSelectiorException: Message: u'The given selector strong/following-sibling::text() is either invalid or does not result in a WebElement. The following error occurred:n[InvalidSelectorError] The result of the xpath expression "strong/following-sibling::text()" is: [object Text]. It should be an element.'
любые идеи, почему это не работает?
4 ответов
@RossPatterson правильно. Беда в том, что текст "Ансель Адамс" не является WebElement
, Так что вы не можете использовать find_element
или find_elements
. Если вы измените свой HTML-код
<span class="metadata">
<strong>Photographer's Name: </strong>
<strong>Ansel Adams</strong>
</span>
затем find_element_by_xpath('strong/following-sibling::*[1]').text
возвращает 'Ansel Adams'.
чтобы получить текст "Ansel Adams", просто используйте metaData.get_text()
. Я не верю find_element_by_*
позволит вам найти текстовый узел.
это задокументировано в этом отчете об ошибке Selenium: http://code.google.com/p/selenium/issues/detail?id=5459
" ваш xpath не возвращает элемент; он возвращает текстовый узел. Хотя это могло быть вполне приемлемо в Selenium RC (и, по расширению, Selenium IDE), методы в интерфейсе WebDriver WebElement требуют объекта элемента, а не только любого объекта узла DOM. Благодаря этому, работает, как задумано. Чтобы устранить проблему, вам нужно изменить HTML разметка для обертывания текстового узла внутри элемента, например a ."
этот код работает в PHP:
$this->getText("//span[@class='metadata']/text()[2]");
Я думаю, вы должны попробовать с таким выражением XPath.