【问题标题】:How to get the text using XPATH如何使用 XPATH 获取文本
【发布时间】:2022-02-16 21:26:42
【问题描述】:
<div class="Fz(12px) Px(8px) Mend(4px) Va(m) Bdrs(3px) C($c-fuji-grey-g) Bgc($c-fuji-grey-b) Cur(d) Py(3px)"><svg class="Mend(6px) Cur(d) Cur(p)" width="18" height="18" viewBox="0 0 48 48" data-icon="traffic" style="vertical-align: middle; fill: rgb(51, 51, 51); stroke: rgb(51, 51, 51); stroke-width: 0;"><path d="M35.826 11.728c-1.102.044-1.96.975-1.918 2.078.045 1.102.975 1.96 2.078 1.918l3.73-.15.014.015-10.033 10.033L19.6 15.527c-.78-.78-2.047-.78-2.827 0-.142.142-.25.302-.338.47-.168.09-.33.197-.47.34L.585 31.714c-.78.78-.78 2.047 0 2.828.392.39.904.586 1.415.586s1.024-.196 1.414-.587L18.187 19.77l10.07 10.068c.39.39.9.586 1.413.586s1.024-.195 1.414-.586c.11-.11.2-.23.28-.355.167-.09.327-.197.468-.34l10.71-10.71-.148 3.7c-.023.58.204 1.112.585 1.493.343.343.81.563 1.333.584 1.104.044 2.035-.815 2.078-1.918l.44-11.003-11.004.438z"></path></svg>Bullish</div>

我正在尝试提取文本,'Bullish',使用 XPATH 但它不成功。

sentiment_search = '//*[@id="canvass-0-CanvassApplet"]/div/ul/li/div/div[3]/div/div/text()'
sentiment = driver.find_elements(By.XPATH, sentiment_search).text
try:
    for i in range(len(posts)):
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, sentiment_search)))
            if sentiment == 'Bullish': 
                 print('Bullish')

【问题讨论】:

  • 您提供的 DOM 行显然有很多随机属性。唯一的静态属性看起来像data-icon="traffic"。此外,它看起来像是包含在 svg 元素中。如果不查看与该段相关的完整 DOM,就很难缩小元素的范围。如果这是您页面中唯一的svg 元素,那么您可以尝试driver.find_element(By.XPATH, "//*[name()='svg']).text。此外,请尝试使用 visibility_of_element_located 而不是 presence_of_element_located,因为有时元素可能存在但不可见,因此提取失败

标签: python-3.x selenium web-scraping xpath


【解决方案1】:

要提取文本Bullish,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一locator strategies

  • 使用CSS_SELECTOR

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#canvass-0-CanvassApplet > div > ul > li > div > div:nth-of-type(3) > div > div"))).text)
    
  • 使用XPATH

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@id="canvass-0-CanvassApplet"]/div/ul/li/div/div[3]/div/div"))).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】:

    您不需要 xpath 中的“text()”:

    sentiment_search = '//*[@id="canvass-0-CanvassApplet"]/div/ul/li/div/div[3]/div/div'
    

    然后从元素中获取文本:

    sentiment = driver.find_elements(By.XPATH, sentiment_search).text
    

    如果只有一个元素,我建议使用 find_element 而不是 find_elements,它会返回所有匹配元素的列表。

    【讨论】:

    • 我试过了,但它给了我:AttributeError: 'list' object has no attribute 'text'
    • 因为 find_elements 将所有匹配元素的列表返回到您的 xpath。这就是为什么我建议使用 find_element(不带 S),如果您要查找的元素不是第一个元素,请在您的 xpath 中添加另一个条件。
    猜你喜欢
    • 2021-02-18
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多