【问题标题】:Extract text under div class using Selenium and Python使用 Selenium 和 Python 提取 div 类下的文本
【发布时间】:2020-09-30 15:25:22
【问题描述】:
我正在尝试从此元素中提取文本:
<div class="_pac" data-bt="{"ct":"sub_headers"}"><a href="https://www.facebook.com/pages/%EB%B6%81%EC%9D%BC%EC%97%AC%EC%9E%90%EA%B3%A0%EB%93%B1%ED%95%99%EA%B5%90/110634532291267">북일여자고등학교</a><div class="_1my"></div></div>
我正在尝试在 href 之后提取文本 -
'북일여자고등학교'
到目前为止我尝试过:
content = driver.find_element_by_css_selector('div._pac')
for i in content:
i.get_attribute('text')
但是,它没有返回任何东西。如何提取文本?
【问题讨论】:
标签:
selenium
xpath
css-selectors
python-3.6
webdriverwait
【解决方案1】:
所需的文本 북일여자고등학교 位于父节点 <a> 的子节点 <div> 内。
要打印文本북일여자고등학교,您必须为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:
-
使用CSS_SELECTOR 和.get_attribute("innerHTML"):
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div._pac>a[href^='https://www.facebook.com/pages']"))).get_attribute("innerHTML"))
-
使用XPATH和text属性:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='_pac']/a[starts-with(@href, 'https://www.facebook.com/pages')]"))).text)
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
-
两个背靠背执行的控制台输出:
북일여자고등학교
您可以在How to retrieve the text of a WebElement using Selenium - Python找到相关讨论
结尾
链接到有用的文档:
【解决方案2】:
您的页面上似乎有多个div 和_pac 类。在您的情况下,它正在定位第一个元素并且没有文本。
find_element 方法定位验证第一个元素,以防同一元素多次出现。
尝试使您的定位器更加独特和具体以定位单个元素。参考以下代码:
content = driver.find_element_by_xpath("//div[contains(@data-bt,'sub_headers')]/a")
content.text
您似乎在循环内容,但您使用的是find_element 而不是find_elements,所以用find_elements 方法替换它
循环遍历相同类型元素中存在的所有文本,使用以下代码:
content = driver.find_elements_by_css_selector('div._pac')
for element in content:
print(element.text)
【解决方案3】:
要从 <a> 标签中提取文本,就像你的意思一样,使用这个 css 选择器 div._pac > a。请尝试以下解决方案:
content = driver.find_element_by_css_selector('div._pac > a')
print(content.text)
#or use '.get_attribute'
print(content.get_attribute("innerHTML"))
如果页面上有多个相同分类的元素,可以使用.find_elements_*,它会返回一个webelemet列表,并循环提取:
content = driver.find_elements_by_css_selector('div._pac > a')
for el in content:
print(el.text)
#or use '.get_attribute'
print(el.get_attribute("innerHTML"))
【解决方案4】:
请记住在关闭驱动程序之前进行提取!
我遇到了这个问题,因为即使我的变量元素充满了数据,我在 driver.close() 之后也有循环!
所以在 .close() 之前循环。
示例:
driver = webdriver.Chrome()
...
LOOP for(..)...
...loop does smth...
driver.close()