使用 Selenium 和 Python 在 div class 下提取文本

Extract text under div class using Selenium and Python

我正在尝试从此元素中提取文本:

<div class="_pac" data-bt="{&quot;ct&quot;:&quot;sub_headers&quot;}"><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"))
    
  • 使用 XPATHtext 属性:

    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()