尝试在python中使用selenium从div类中获取文本

尝试在python中使用selenium从div类中获取文本,python,selenium,Python,Selenium,包含我要打印的数据的HTML div类 我打印出来的都是 selenium.webdriver.remote.webelement.webelement (session=“9aa956e2bd51f510dd626f6937b01c0e”, element=“0.6506218589958-1”) 不是文本 我是新来的selenium,非常感谢您打印元素。打印(At.text)而不是At您正在打印元素。打印(At.text)而不是AtIntro 首先,我建议css使用更快的解析器在selen

包含我要打印的数据的HTML div类

我打印出来的都是

selenium.webdriver.remote.webelement.webelement (session=“9aa956e2bd51f510dd626f6937b01c0e”, element=“0.6506218589958-1”)

不是文本
我是新来的selenium,非常感谢您打印元素。打印(At.text)而不是At

您正在打印元素。打印(At.text)而不是At

Intro

首先,我建议css使用更快的解析器在selenium的
页面上选择您的目标

import lxml
import lxml.html

# put this below SearchBox.submit()

CSS_SELECTOR = '#gs_res_ccl_mid > :nth-child(1) > .gs_ri > .gs_a' # Define css
source = driver.page_source                                       # Get all html
At_raw = lxml.html.document_fromstring(source)                    # Convert
At = At_raw.cssselect(CSS_SELECTOR)                               # Select by CSS
解决方案1

然后,您需要从web元素中提取
文本内容()
,并对其进行正确编码

At = At.text_content().encode('utf-8') # Get text and encode
print At
解决方案2

如果
中的
包含多行和unicode,您还可以删除它们:

At = [l.replace(r'[^\x00-\x7F]+','') for line in At \                 # replace unicode
         for l in line.text_content().strip().encode('utf-8').splitlines() \ # Get text
               if l.strip()]                # only consider if line contains characters
print At
简介

首先,我建议css使用更快的解析器在selenium的
页面上选择您的目标

import lxml
import lxml.html

# put this below SearchBox.submit()

CSS_SELECTOR = '#gs_res_ccl_mid > :nth-child(1) > .gs_ri > .gs_a' # Define css
source = driver.page_source                                       # Get all html
At_raw = lxml.html.document_fromstring(source)                    # Convert
At = At_raw.cssselect(CSS_SELECTOR)                               # Select by CSS
解决方案1

然后,您需要从web元素中提取
文本内容()
,并对其进行正确编码

At = At.text_content().encode('utf-8') # Get text and encode
print At
解决方案2

如果
中的
包含多行和unicode,您还可以删除它们:

At = [l.replace(r'[^\x00-\x7F]+','') for line in At \                 # replace unicode
         for l in line.text_content().strip().encode('utf-8').splitlines() \ # Get text
               if l.strip()]                # only consider if line contains characters
print At

看来你就快到了。也许,根据您共享的HTML和代码测试,您看到了所需的输出

解释 执行以下代码行后:

At = driver.find_elements_by_css_selector ('#gs_res_ccl_mid > div:nth-child(1) > div.gs_ri > div.gs_a')
WebElementAt指所需的元素(列表中的单个元素)。在下一步中,当您调用
print(At)
时,将打印At处的WebElement,如下所示:

selenium.webdriver.remote.webelement.WebElement (session="9aa956e2bd51f510dd626f6937b01c0e", element="0.6506218589189958-1")
解决方案 现在,根据您的问题,如果您想要提取文本LR Binford-American antiquity,1980-cambridge.org,您必须通过元素调用以下任一方法:

  • :获取元素的文本
  • :获取元素的给定属性或属性
因此,您需要将代码行更改为:

print (At)
以下任何一项:

  • 使用
    文本

    print(At.text)
    
    print(At.get_attribute("innerHTML"))
    
  • 使用
    获取属性(attributeName)

    print(At.text)
    
    print(At.get_attribute("innerHTML"))
    
  • 您自己的代码,稍作调整:

    # -*- coding: UTF-8 -*-
    from selenium import webdriver
    
    def Author (SearchVar):
    
        options = webdriver.ChromeOptions() 
        options.add_argument("start-maximized")
        options.add_argument('disable-infobars')
        driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
        driver.get ("https://scholar.google.com/")
        SearchBox = driver.find_element_by_name("q")
        SearchBox.send_keys(SearchVar)
        SearchBox.submit()
        At = driver.find_elements_by_css_selector ('#gs_res_ccl_mid > div:nth-child(1) > div.gs_ri > div.gs_a')
        for item in At:
            print(item.text)
    
    Author("dog")
    
  • 控制台输出:

    …, RJ Marles, LS Pellicore, GI Giancaspro, TL Dog - Drug Safety, 2008 - Springer
    

    • 看来你就快到了。也许,根据您共享的HTML和代码测试,您看到了所需的输出

      解释 执行以下代码行后:

      At = driver.find_elements_by_css_selector ('#gs_res_ccl_mid > div:nth-child(1) > div.gs_ri > div.gs_a')
      
      WebElementAt指所需的元素(列表中的单个元素)。在下一步中,当您调用
      print(At)
      时,将打印At处的WebElement,如下所示:

      selenium.webdriver.remote.webelement.WebElement (session="9aa956e2bd51f510dd626f6937b01c0e", element="0.6506218589189958-1")
      
      解决方案 现在,根据您的问题,如果您想要提取文本LR Binford-American antiquity,1980-cambridge.org,您必须通过元素调用以下任一方法:

      • :获取元素的文本
      • :获取元素的给定属性或属性
      因此,您需要将代码行更改为:

      print (At)
      
      以下任何一项:

      • 使用
        文本

        print(At.text)
        
        print(At.get_attribute("innerHTML"))
        
      • 使用
        获取属性(attributeName)

        print(At.text)
        
        print(At.get_attribute("innerHTML"))
        
      • 您自己的代码,稍作调整:

        # -*- coding: UTF-8 -*-
        from selenium import webdriver
        
        def Author (SearchVar):
        
            options = webdriver.ChromeOptions() 
            options.add_argument("start-maximized")
            options.add_argument('disable-infobars')
            driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
            driver.get ("https://scholar.google.com/")
            SearchBox = driver.find_element_by_name("q")
            SearchBox.send_keys(SearchVar)
            SearchBox.submit()
            At = driver.find_elements_by_css_selector ('#gs_res_ccl_mid > div:nth-child(1) > div.gs_ri > div.gs_a')
            for item in At:
                print(item.text)
        
        Author("dog")
        
      • 控制台输出:

        …, RJ Marles, LS Pellicore, GI Giancaspro, TL Dog - Drug Safety, 2008 - Springer
        

      可能重复的内容,请粘贴HTML。屏幕截图没有这么大的帮助。你应该使用
      驱动程序。通过\u css\u选择器查找\u元素\u
      ,而不是
      驱动程序。通过\u css\u选择器查找\u元素\u
      。并且应该是
      print(At.text)
      您正在使用print(At)打印元素,请使用
      print(At.text)
      代替,不相关,但我建议使用带有Beautifulsoup的请求,而不是Seleniu。您可以粘贴HTML的不可能的副本。屏幕截图没有这么大的帮助。你应该使用
      驱动程序。通过\u css\u选择器查找\u元素\u
      ,而不是
      驱动程序。通过\u css\u选择器查找\u元素\u
      。并且应该是
      print(At.text)
      如果您使用print(At.text)打印元素,请改用
      print(At.text)
      ,不相关,但我建议使用带有Beautifulsoup的请求,而不是seleniumAFAIK。如果您使用unicode(货币符号等),这将不起作用。此外,这不会删除只有空格的行和类似的人工制品。如果您使用unicode(货币符号等),这将不起作用。此外,这不会删除纯空白行和类似的artefactsOP明确表示希望在python中使用selenium获得输出,而您建议使用
      lxml
      ,这看起来比简单地添加
      text
      属性复杂得多……我建议的解决方案需要python和selenium。(driver.page_source)。事实上,这是我回答的第一句话。出于性能原因,我建议使用不同的解析器,我还建议使用一种文本提取方法,这种方法适用于所有场景,而不仅仅是某些场景。如果
      text
      不起作用,OP可能会使用
      get\u属性(“textContent”)
      。此外,使用第三方库提取一个文本值似乎并没有带来多少效率或改进。我同意您的看法。一旦OP决定在将来刮取多个值,我的代码可能会有更多帮助。我对此进行了基准测试,与香草硒相比,使用sel的page_source+lxml,我的吞吐量/秒实际上翻了一番。同时,我们希望他的值不包含任何货币符号。OP明确表示希望在python中使用selenium获得输出,而您建议使用
      lxml
      ,这看起来比简单地添加
      text
      属性复杂得多……我建议的解决方案需要python和selenium。(driver.page_source)。事实上,这是第一句话