【问题标题】:Extract text under div class using Selenium and Python使用 Selenium 和 Python 提取 div 类下的文本
【发布时间】:2020-09-30 15:25:22
【问题描述】:

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

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

但是,它没有返回任何东西。如何提取文本?

【问题讨论】:

    标签: selenium xpath css-selectors python-3.6 webdriverwait


    【解决方案1】:

    所需的文本 북일여자고등학교 位于父节点 &lt;a&gt; 的子节点 &lt;div&gt; 内。

    要打印文本북일여자고등학교,您必须为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"))
      
    • 使用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
      
    • 两个背靠背执行的控制台输出:

      북일여자고등학교
      

    您可以在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】:

      要从 &lt;a&gt; 标签中提取文本,就像你的意思一样,使用这个 css 选择器 div._pac &gt; 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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-08
          • 2017-06-07
          • 2021-03-05
          相关资源
          最近更新 更多