【问题标题】:Python selenium gives me an empty string for <span> text<span>Python selenium 给了我一个空字符串 <span> text<span>
【发布时间】:2021-02-28 16:45:31
【问题描述】:

我有一个包含以下 40 个 div 的 HTML 页面

<div class='movie-featured'>
    <div class="item analytics">
        <div class="movie-details">
            <div class="movie-rating-wrapper">
                <span class="movie-rating-summary">
                    <span>some text</span>
                </span>
            </div>
        </div>
    </div>
</div>

我正在尝试通过find_element_by_css_selector('span.moview-rating-summary').find_element_by_tag_name('span').text在 40 个 div 中的每一个中获取此范围内的文本 &lt;span&gt;some text&lt;/span&gt; rom:find_element_by_css_selector('span.moview-rating-summary').find_element_by_tag_name('span').text

输出:

['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '6/10', '', '', '', '', '', '', '', '', '7.5/10', '', '', '', '', '']

如您所见,我只从几个跨度中获取文本,而不是全部。

我也试过了:find_element_by_tag_name('span').get_attribute('textContent')find_element_by_tag_name('span').get_attribute('innerHTML')

但结果还是一样

有什么办法解决这个问题吗?

代码试验:

from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
browser = webdriver.Chrome()
delay = 10 
browser.get("www.example.com")


browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(2)
images =[]

myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.CLASS_NAME, 'item-responsive')))


body = browser.find_element_by_class_name('movie-featured') # body of images container

imageItems = body.find_elements_by_css_selector('div.item.analytics')  #list of divs that hold movies images


for item in imageItems:
    
    rate = item.find_element_by_css_selector('span.moview-rating-summary').text

    images.append(rate)
    
print(images)
browser.close()

感谢你们提供的所有帮助。 我通过如下更改代码解决了这个问题:

body = browser.find_element_by_class_name('movie-featured')
rateDivs = body.find_elements_by_xpath('//div[@class="moview-rating-wrapper"]')
ratelist = []
for div in rateDivs:
    span = div.find_element_by_css_selector('span.moview-rating-summary')
    ratespan = span.find_element_by_tag_name('span')
    rate = ratespan.text
    if len(rate) > 0:
        ratelist.append(rate)
    else:
        continue
print(ratelist)

browser.close()

非常感谢您为帮助我所花费的所有时间。

【问题讨论】:

  • 第一个问题好!继续发帖!
  • 你能分享你正在使用的网址吗? - 我认为有一种更有效的方法使用 find_elements_ 在没有循环的情况下获得你想要的东西,但如果想在我发布答案之前对其进行测试
  • @RichEdwards 我使用的网址是我所在国家/地区的 ISP 专用的,在国外无法使用
  • 感觉你的标识符中有一些东西没有按预期工作。你知道如何使用 devtools 来查看所有匹配项吗?
  • 打开 devtools (F12),转到元素选项卡,按 crtl+f,然后输入您的 xpath 或 css。您的标识符匹配的所有内容都是您将使用 find_elements 返回的内容 - 查看这些内容并确保它们都具有您期望的文本... legend42 的 xpath 几乎就是我将使用的内容,因此将其放入并查看是否所有跨度都有文本.... 如果您确定您的跨度有文本,那么请考虑它们是否都需要滚动到视图中才能“存在”。

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

提取文本,例如一些文本,从所有的&lt;span&gt; 中使用Selenium,您必须将WebDriverWait 诱导为visibility_of_all_elements_located(),并且您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTORget_attribute("innerHTML")

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.movie-rating-summary>span")))])
    
  • 使用XPATHtext属性:

    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[@class='movie-rating-summary']/span")))])
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

结尾

链接到有用的文档:

【讨论】:

    【解决方案2】:

    试试这个:

    driver.find_element_by_xpath('//span[@class="movie-rating-summary"]/span[1]')
    

    【讨论】:

    • 感谢您的回复,我尝试了您的方法,并且在帖子 [空字符串] 中得到了相同的输出。有没有办法检查元素 是否有数据??
    • 您可以在 Chrome 开发者收费控制台中执行以下代码进行交叉检查。var doc = document.getElementsByClassName("ClassName");for(var i=0; i&lt;doc.length; i++){console.log(doc.item(i).innerText)};
    • @DilipMeghwal 它为我提供了 span 元素的所有值,但我仍然无法在我的 selenium 代码中获取它们。
    • @MartinWittick 你可以在捕获速率时使用item.find_element_by_css_selector('span.moview-rating-summary').get_attribute("innerText")
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签