Использование селектора 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.