Как получить текст под тегом - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь получить текст под тегом enter image description here

Я пробовал несколько разных вариантов:

dneyot=driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]/text()")
dneyot=driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]/b[1]/text()")

мой кусок кода:

dneyot=driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]/text()")
for spisok in dneyot:
    print("Период показов >3 дней", spisok.text)

UPD: я нахожу нужные мне элементы в браузере, используя:

//*[starts-with(@id, 'popover-')]/text()[1]

, но получаю ошибку

    selenium.common.exceptions.InvalidSelectorException:
Message: invalid selector: The result of the xpath expression "//*[starts-with(@id, 'popover-')]/text()[1]" is: [object Text]. It should be an element.

Ответы [ 5 ]

0 голосов
/ 07 февраля 2019

Вы можете использовать регулярное выражение, чтобы получить даты:

import re

#...

rePeriod = '(.*)(\\d{4}-\\d{2}-\\d{2} - \\d{4}-\\d{2}-\\d{2})(.*)'

dneyot = driver.find_elements_by_css_selector('div[id^="popover-"]')
for spisok in dneyot:
    m = re.search(rePeriod, spisok.text)
    print("Период показов >3 дней", m.group(2))
0 голосов
/ 07 февраля 2019

Если вы хотите получить этот текст, исключая текст узла <b>, вам нужно использовать следующий XPath:

//div[starts-with(@id, 'popover-')]

, который будет идентифицировать узел div, а затем с помощью метода find_elements_by_xpath(),Вы можете получить весь текст из узла div.Попробуйте следующий код:

elements = driver.find_elements_by_xpath("//div[starts-with(@id, 'popover-')]") 
for element in elements:
    print(element.text)

Обновление:

Я подозреваю, что описанный выше метод может не работать, и мы не сможем определить / получить эти данные с помощьюобычные методы - в этом случае вам нужно использовать JavaScriptExecutor для получения данных, как показано ниже:

driver = webdriver.Chrome('chromedriver.exe')
driver.get("file:///C:/NotBackedUp/SomeHTML.html")

xPath = "//div[starts-with(@id, 'popover-')]"
elements = driver.find_elements_by_xpath(xPath)
for element in elements:
    lenght = int(driver.execute_script("return arguments[0].childNodes.length;", element));
    for i in range(1, lenght + 1, 1):
        try:
            data = str(driver.execute_script("return arguments[0].childNodes["+str(i)+"].textContent;", element)).strip();
            if data != None and data != '':
                print data
        except:
            print "=> Can't print some data..."

Поскольку ваш сайт написан на другом языке, отличном от английского, вы не сможете распечатать / получить некоторыеdata.

Для получения данных о конкретных дочерних узлах вам нужно сделать следующее:

from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
driver.get("file:///C:/NotBackedUp/SomeHTML.html")

xPath = "//div[starts-with(@id, 'popover-')]"
elements = driver.find_elements_by_xpath(xPath)
for element in elements:
    # For print b1 text
    b1Text = driver.execute_script("return arguments[0].childNodes[2].textContent", element);
    print b1Text

    # For printing b2 text
    b2Text = driver.execute_script("return arguments[0].childNodes[6].textContent", element);
    print b2Text

print("=> Done...")

Надеюсь, это поможет ...

0 голосов
/ 07 февраля 2019

find_elements_by_xpath() возвращает webelement - базовый объект selenium фактически работает с.
Ваш xpath заканчивается /text() - который вернет вам текстовое содержимое узла в XML-документе, а не объект, ожидаемый селеном.Итак, просто измените его, чтобы не иметь этот суффикс - он вернет сам элемент и получит его (элемент) текст, вызвав .text в Python:

dneyot=driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]")
for element in dneyot:
    print("Период показов >3 дней", element.text)
0 голосов
/ 07 февраля 2019

text() возвращает текстовый узел, селен не знает, как с ним работать, он может обрабатывать только WebElement с.Вам нужно получить текст для элемента с идентификатором «popover» и работать с возвращенным текстом

elements = driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]")
for element in elements:
    lines = element.text.split('\n')
    for line in lines:
        print("Период показов >3 дней", line)
0 голосов
/ 07 февраля 2019

Использование Beautifulsoup:

Найдите div с id = popover-34252127 внутри родителя div.

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.your_url_here.com/")

soup = BeautifulSoup(page.content, 'html.parser')
data = soup.find("div", {"id": "popover-34252127"})
print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...