【问题标题】:Get text from text node above span tag从 span 标签上方的文本节点获取文本
【发布时间】:2021-02-23 15:03:53
【问题描述】:

以下是我尝试使用 python 和 selenium 抓取的一些 html。

<h2 class ="page-title">  
    Strange Video Titles
    <span class="duration">28 min</span>  
    <span class="video-hd-mark">720p</span> 
</h2> 

下面是我的代码:

title=driver.find_element_by_class_name('page-title').text
print(title)

但是,当我运行它时,它会打印 h2 标记中的所有内容,包括 span 类中的文本。我尝试在末尾添加 [0] 或 [1] 以指定我只想要第一行文本,但这不起作用。如何只打印跨度类上方的视频标题?

编辑 - 我认为这是解决方案

所以我决定做以下事情:

title=driver.find_element_by_class_name('page-title').text
duration = driver.find_element_by_xpath('/html/body/div/div[4]/h2/span[1]').text  
vid_quality =driver.find_element_by_xpath('/html/body/div/div[4]/h2/span[2]').text 


if (duration) in title:
    title = title.replace(duration, "")
if(vid_quality) in title:
    title = title.replace(vid_quality,"")

谢谢。

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    要仅打印视频标题,即 奇怪的视频标题,因为它是一个 文本节点,您必须为 visibility_of_element_located() 引入 WebDriverWait,您可以使用以下Locator Strategies:

    • 使用XPATH、get_attribute() 和splitlines():

      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h2[@class='page-title']"))).get_attribute("innerHTML").splitlines()[1])
      
    • 使用CSS_SELECTOR、childNodes 和strip():

      print(driver.execute_script('return arguments[0].firstChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "h2.page-title")))).strip())
      
    • 注意:您必须添加以下导入:

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

    参考

    您可以在以下位置找到一些相关的详细讨论:

    【讨论】:

      【解决方案2】:

      使用WebDriverWait() 并等待visibility_of_element_located()

      使用JS executor 并使用firstChild 获取标题值

      element=WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"h2.page-title")))
      print(driver.execute_script('return arguments[0].firstChild.textContent;', element))
      

      你需要导入下面的库

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

      【讨论】:

        【解决方案3】:

        使用.contents

        spam = """
        <h2 class ="page-title">  
            Strange Video Titles
            <span class="duration">28 min</span>  
            <span class="video-hd-mark">720p</span> 
        </h2>"""
        
        from bs4 import BeautifulSoup
        
        soup = BeautifulSoup(spam, 'html.parser')
        h2 = soup.find('h2')
        print(h2.contents[0].strip())
        
        # ALTERNATIVE -  remove the span tags
        for span in h2.find_all('span'):
           span.decompose()
        print(h2.text.strip())
        

        输出

        Strange Video Titles
        

        【讨论】:

        • 您好,非常感谢您抽出宝贵时间提供帮助。我使用的是 selenium,而不是 bs4,所以你的解决方案不起作用。但是,如果您看到我对问题所做的编辑,我更改了查找跨度文本的方式。但是,我仍然有一些困难。如果不是太多要求,请您看一下我所做的编辑吗?谢谢。
        • 哦,我忽略了selenium 部分
        猜你喜欢
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2014-01-10
        相关资源
        最近更新 更多