Я пытаюсь извлечь «479» из этого образца HTML:
<div data-testid = "testid">
"479"
" Miles Away"
</div>
Я использую следующий код Selenium в Python:
xpath = 'html/body/div/text()[1]'
WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, xpath)))
distance = driver.find_element(By.XPATH, xpath)
print(distance)
Что возвращает следующую ошибку:
'The result of the xpath expression "html/body/div/text()[1]" is: [object Text]. It should be an element.'
Я попытался удалить text()[1]
из конца моего xpath, теоретически распечатав все данные, содержащиеся в HTML-разделе, но вместо этого он напечатает пустую строку, когда я это сделаю.
Примечание. Я любитель и самоучка (в основном через Google, YouTube и этот сайт), поэтому некоторые мои слова могут быть неточными. Прошу прощения заранее.
Проблема в том, что вы не можете так обрабатывать текст, функция text() возвращает все в виде строки, включая разрыв строки. Я думаю, что нет функции разделения, которая может помочь вам в этом, я советую вам получить текст в переменной python и выполнить разделение ('\ n') для текста.
xpath = 'html/body/div/text()'
WebDriverWait(driver,30).until(EC.visibility_of_element_located((By.XPATH, xpath)))
distance = driver.find_element(By.XPATH, xpath)
print(distance.split('\n')[0])
Вы должны взять весь элемент (без текста()), используя только
html/body/div
затем из возвращенного элемента получите текст, который будет: «479» «Miles Away». Затем, используя метод разделения из python, вы можете взять это число (разделить на \n, пробел или ").
Selenium не поддерживает следующий xpath
xpath = 'html/body/div/text()[1]'
Чтобы однозначно идентифицировать элемент, ваш xpath должен выглядеть как
xpath = '//div[@data-testid = "testid"]'
WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, xpath)))
distance = driver.find_element(By.XPATH, xpath).text
print(distance)
Чтобы получить текст элемента, вы должны использовать element.text
Учитывая html:
<div data-testid = "testid">
"479"
" Miles Away"
</div>
Оба текста 479
и Miles Away
находятся в двух разных текстовых узлах.
Selenium не поддерживает text()
, так как возвращает текстовый узел, тогда как Selenium ожидает обратно WebElement. Следовательно, вы видите ошибку:
The result of the xpath expression "html/body/div/text()[1]" is: [object Text]. It should be an element.
Чтобы извлечь текст 479, вы можете использовать одну из следующих стратегий локатора:
Используя xpath через execute_script()
и textContent:
print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='testid']")))).strip())
Используя xpath через splitlines()
и get_attribute()
:
print(WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='testid']"))).get_attribute("innerHTML").splitlines()[1])