【问题标题】:Python selenium and fuzzy matchingPython selenium 和模糊匹配
【发布时间】:2015-10-08 15:08:15
【问题描述】:

我正在使用Selenium 填充一些下拉菜单。这些下拉菜单是相当动态的。

我所拥有的是可能在下拉列表中的值,例如:

<select>
    <option>Red, wooly, jumper, large, UK</option>
    <option>Blue, wooly, jumper, small, USA</option> 
    <option>Red, wooly, scarf, small, UK</option>
</select>

理想情况下,我要做的是选择最接近以下字符串的选项

'Red, wooly, small, UK'

这将从下拉列表中选择第三项

这可以通过某种匹配器来完成吗?如果是这样,我将如何从下拉列表中选择正确的元素?

谢谢

【问题讨论】:

    标签: python fuzzy-comparison


    【解决方案1】:

    您是否尝试过使用正则表达式? Python 正则表达式来匹配第三行,甚至使用 pythons 内置的 .find() 方法。由于您使用的是 selenium,因此您可以找到所有选项元素,遍历每个元素,检查每个元素的文本,并将其与您的字符串进行比较。

    例如

    elem = browser.find_elements_by_tag_name("option") 
    for ele in elem:
      if ele.get_attribute("innerHTML").find('Red') > -1 and ele.get_attribute("innerHTML").find('wolly') > -1 and ele.get_attribute("innerHTML").find('small') > -1 and ele.get_attribute("innerHTML").find('small') > -1:
        #TODO
    

    但是这有点长,所以我会使用正则表达式,例如:

    import re
    elem = browser.find_elements_by_tag_name("option") 
    for ele in elem:
      m = re.search(r'(Red,.+wooly,.+small,.+UK)', ele.get_attribute("innerHTML"))
      if m:
        print m.group(1)
    

    如果.get_attribute("innerHTML") 没有得到内部文本,试试.text()

    【讨论】:

    • m 会给我元素/文本吗?
    • m 是匹配项,如果要打印文本元素,请参阅上面我现在要进行的更新,假设 selenium 找到了所有标签,但如果你打印 group(1) 它应该打印 Red,wooly, Scarf, small, UK
    • 我刚用if m: element.click()
    • 好吧,如果 m 就是你想要点击的元素(在我的例子中是 ele.click()),打印 m.group(1) 只会打印 ,我误读了您之前的评论,无论哪种方式,使用正则表达式是匹配模糊的好方法,我使用这个网站检查我的正则表达式,然后再将其放入代码pythex.org
    【解决方案2】:

    您可以从选项中获取文本,然后比较您的文本,如下所示:

    elms = driver.find_elements_by_css_selector("select > option")
    ops = []
    for el in elms:
        ops.append(el.text)
    
    s = 'Red, wooly, small, UK'.split(", ")
    
    weight = []
    
    for op in ops:
        n_occurance = 0
        for text in s:
            if text in op:
                n_occurance += 1
    
        weight.append(n_occurance)
    
    most_like = weight.index(max(weight)
    
    elems[most_like].click()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2015-11-10
      相关资源
      最近更新 更多