【问题标题】:Webdriver: How to find elements when class name contains space?Webdriver:当类名包含空格时如何查找元素?
【发布时间】:2015-09-12 21:31:41
【问题描述】:

每个“7-pack”搜索结果here 都包含许多评论,例如“5 条评论”、“无评论”等。

每个类的名称是fl r-iNTHbQvDybDU。它包含一个空格,所以如果我尝试 find_elements_by_class_name(),我会得到:

InvalidSelectorError: Compound class names not permitted

根据此处的其他答案,我需要做的就是删除空间并重试。不走运 - 一个空列表

所以我试试find_element_by_css_selector()

find_elements_by_css_selector(".fl.r-iNTHbQvDybDU")

仍然没有运气 - 空列表。接下来你会尝试什么?

【问题讨论】:

标签: python css python-2.7 selenium-webdriver webdriver


【解决方案1】:

这个怎么样:

browser.find_elements_by_css_selector("div[class='fl r-iNTHbQvDybDU']")

这假定标记为class = div

如果是别的东西 - 否则用适当的标签替换 div..

【讨论】:

    【解决方案2】:

    我不会依赖这些自动生成的类名。除了不可靠之外,它还会降低您的代码的可读性。相反,获取包含“评论”文本的链接

    Webdriver/Selenium: How to find element when it has no class name, id, or css selecector? 线程的组合解决方案:

    import re
    
    from selenium.common.exceptions import NoSuchElementException    
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium import webdriver
    
    
    driver = webdriver.Chrome()
    driver.get('https://www.google.com/?gws_rd=ssl#q=plumbers%2BAvondale%2BAZ')
    
    # waiting for results to load
    wait = WebDriverWait(driver, 10)
    box = wait.until(EC.visibility_of_element_located((By.ID, "lclbox")))
    
    phone_re = re.compile(r"\(\d{3}\) \d{3}-\d{4}")
    
    for result in box.find_elements_by_class_name("intrlu"):
        for span in result.find_elements_by_tag_name("span"):
            if phone_re.search(span.text):
                parent = span.find_element_by_xpath("../..")
                print parent.text
                break
    
        try:
            reviews = result.find_element_by_partial_link_text("review").text
        except NoSuchElementException:
            reviews = "0 Google reviews"
    
        print reviews
        print "-----"
    

    打印:

    360 N Central Ave
    Avondale, AZ
    (623) 455-6605
    1 Google review
    -----
    Avondale, AZ
    (623) 329-5170
    4 Google reviews
    -----
    Tolleson, AZ
    (623) 207-1995
    7 Google reviews
    -----
    3947 N 146th Dr
    Goodyear, AZ
    (602) 446-6576
    1 Google review
    -----
    564 W Western Ave
    Goodyear, AZ
    (623) 455-6605
    0 Google reviews
    -----
    14190 W Van Buren St
    Goodyear, AZ
    (623) 932-5300
    0 Google reviews
    -----
    

    【讨论】:

    • 谢谢,但这也会返回一个空列表。如果我将部分文本缩短为“评论”,仍然是一个空列表。元素是 - find_elements_by_partial_link_text() 是否仅适用于
    • @Pyderman 已更新,您只需要明确等待结果加载即可。
    • @alexce 谢谢 - 在大多数情况下,这一直运作良好。但是,当搜索返回一些没有任何评论的结果时(参见 google.com/?gws_rd=ssl#q=plumbers%2BAvondale%2BAZ 示例),它就会崩溃,因为它只提取那些具有“* Google 评论”元素的结果
    • @alexce 因此,在结果没有评论的情况下,“intrlu”类的 div 没有样式 white-space:nowrap 的跨度。我们将如何应用您在此答案stackoverflow.com/a/31076043/1389110 中给出的方法?即我们如何提取(i)那些跨度(当它们存在时)和(ii)以某种方式应用“0评论”的值,其中跨度不存在给定结果?
    • @Pyderman 我会在每个结果中搜索review 部分链接文本并捕获NoSuchElementException,这意味着我们有0 条评论。我已经更新了这个答案中的代码。此外,通过单个 google 评论解决了问题(搜索 review 而不是 reviews)。谢谢。
    【解决方案3】:

    试试这个:

    find_elements_by_css_selector(".r-iNTHbQvDybDU")
    

    【讨论】:

    • 谢谢。不过返回一个空列表。
    【解决方案4】:

    你需要在它前面添加标签名称。

    比如在一个div元素里面,那么:

    Selenium.find_element_by_class_name(div.ur.class.name)
    

    【讨论】:

      【解决方案5】:

      我建议您使用 XPATH 或 CSS_SELECTOR。 “选择器小工具”扩展是谷歌浏览器的免费扩展,只需单击一次即可提供 XPath 或 CSS。

      然后:

      find_elements_by_xpath("your xpath")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2020-05-19
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 2018-05-19
        • 2013-05-29
        相关资源
        最近更新 更多