我尝试了几种不同的选择:
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.
答案 0 :(得分:1)
使用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)
答案 1 :(得分:1)
find_elements_by_xpath()
返回一个Web元素-硒实际使用的基本对象。
您的xpath以/text()
结尾-这将返回xml文档中节点的文本内容-硒对象不期望。因此,只需更改它的后缀即可-它将返回元素本身,并通过在Python中调用.text
获得其(元素的)文本:
dneyot=driver.find_elements_by_xpath("//*[starts-with(@id, 'popover-')]")
for element in dneyot:
print("Период показов >3 дней", element.text)
答案 2 :(得分:1)
text()
返回文本节点,硒不知道如何处理,它只能处理WebElement
s。您需要获取ID为“ 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)
答案 3 :(得分:1)
如果要获取<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..."
由于您的网站是用英语以外的其他语言编写的,因此您可能无法打印/获取一些数据。
要获取特定的子节点数据,您需要执行以下操作:
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...")
希望对您有帮助...
答案 4 :(得分:1)
您可以使用正则表达式获取日期:
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))