尝试在python中使用selenium从div类中获取文本
包含我要打印的数据的HTML div类 我打印出来的都是 selenium.webdriver.remote.webelement.webelement (session=“9aa956e2bd51f510dd626f6937b01c0e”, element=“0.6506218589958-1”) 不是文本尝试在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
我是新来的selenium,非常感谢您打印元素。打印(At.text)而不是At您正在打印元素。打印(At.text)而不是AtIntro 首先,我建议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)。事实上,这是第一句话