使用 Selenium 和 Python 在 div class 下提取文本
Extract text under div class using Selenium and Python
我正在尝试从此元素中提取文本:
<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')
但是,它没有返回任何东西。如何提取文本?
所需文本 북일여자고등학교 位于父 <div>
节点内的子 <a>
节点内。
要打印文本 북일여자고등학교 你必须诱导 for the visibility_of_element_located()
and you can use either of the following :
使用 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
两次背靠背执行的控制台输出:
북일여자고등학교
You can find a relevant discussion in
结尾
Link 到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性returnsThe text of the element.
- Difference between text and innerHTML using Selenium
您的页面上似乎有多个 div
和 class _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)
要像您所说的那样从 <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_*
,会return一个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"))
请记住在关闭驱动程序之前进行提取!
我遇到了这个问题,因为我在 driver.close() 之后循环,即使我的变量元素充满了数据!
所以在 .close() 之前循环。
示例:
driver = webdriver.Chrome()
...
LOOP for(..)...
...loop does smth...
driver.close()
我正在尝试从此元素中提取文本:
<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')
但是,它没有返回任何东西。如何提取文本?
所需文本 북일여자고등학교 位于父 <div>
节点内的子 <a>
节点内。
要打印文本 북일여자고등학교 你必须诱导 visibility_of_element_located()
and you can use either of the following
使用
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
两次背靠背执行的控制台输出:
북일여자고등학교
You can find a relevant discussion in
结尾
Link 到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性returnsThe text of the element.
- Difference between text and innerHTML using Selenium
您的页面上似乎有多个 div
和 class _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)
要像您所说的那样从 <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_*
,会return一个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"))
请记住在关闭驱动程序之前进行提取!
我遇到了这个问题,因为我在 driver.close() 之后循环,即使我的变量元素充满了数据!
所以在 .close() 之前循环。
示例:
driver = webdriver.Chrome()
...
LOOP for(..)...
...loop does smth...
driver.close()