2014-12-13 2 views
2

Как получить текст первой, подчеркивающей и последней части question и сохранить ее в переменной, используя Splinter?Splinter: Получение фрагментов текста XPATH, которые не являются уникальными элементами

См. HTML внизу. Я хочу сделать следующие переменные имеют следующие значения:

first_part = "Jingle bells, jingle bells, jingle all the" 
second_part = "_______" 
third_part = "! Oh what fun it is to ride in one-horse open sleigh!" 

я пошел here, использовал XPaths

//*[@id="question_container"]/div[1]/span/text()[1] #this is first_part 
//*[@id="question_container"]/div[1]/span/span  #this is second_part 
//*[@id="question_container"]/div[1]/span/text()[2] #this is third_part 

и применил их к ниже HTML. Они вернули желаемые значения в тесте, но для моей программы, Splinter, кажется, отказаться от них:

first_part = browser.find_by_xpath(xpath = '//*[@id="question_container"]/div[1]/span/text()[1]').text 
second_part = browser.find_by_xpath(xpath = '//*[@id="question_container"]/div[1]/span/span').text 
third_part = browser.find_by_xpath(xpath = '//*[@id="question_container"]/div[1]/span/text()[2]').text 

print first_part 
print second_part 
print third_part 

-------------- OUTPUT  ------------- 

[] 
[] 
[] 

Что я делаю не так, почему это не так, и как я должен изменить свой код?

Упомянутый к HTML (который был слегка отредактированного в «Jingle Bells», чтобы лучше передать эту проблему) был получен с помощью browser.html особенность Splinter:

<div id="question_container" style="display: block;"> 
<div class="question_wrap"> 

<span class="question">Jingle bells, jingle bells, jingle all the 
<span class="underline" style="display: none;">_______</span> 
<input type="text" name="vocab_answer" class="answer" id="vocab_answer"></input> 
! Oh what fun it is to ride in one-horse open sleigh!</span> 

</div></div> 

ответ

1

xpath передается find_by_xpath() методу должен указывать/результат на элемент, а не на текстовый узел.

Одним из вариантов было бы найти внешний span, получить его html и кормить его lxml.html:

from lxml.html import fromstring 

element = browser.find_by_xpath(xpath='//div[@id="question_container"]//span[@class="question"]') 

root = fromstring(element.html) 
first_part = root.xpath('./text()[1]')[0] 
second_part = root.xpath('./span/text()')[0] 
third_part = root.xpath('./text()[last()]')[0] 

print first_part, second_part, third_part 

Печать:

Jingle bells, jingle bells, jingle all the 
_______ 
! Oh what fun it is to ride in one-horse open sleigh! 
+0

Что я использую вместо 'find_by_xpath()'? Я не могу найти другой соответствующий метод в документации Splinter. –

+0

@Princee вы должны найти 'span' с' class = "question" 'first. Затем вы можете получить части текста, есть несколько вариантов. Можете ли вы предоставить ссылку на веб-сайт для проверки? Благодарю. – alecxe

+0

@Princee спасибо, пожалуйста, попробуйте решение в обновленном ответе. – alecxe

Смежные вопросы