2015-10-08 159 views
2

我使用Selenium來填充一些下拉菜單。這些下拉菜單相當動態。Python硒和模糊匹配

我有什麼,雖然都信奉這一價值可能在下拉列表中,例如:

<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' 

這將從下拉列表中選擇第3項

這可以通過某種匹配器來完成嗎?如果是這樣,我將如何從下拉列表中選擇正確的元素?

謝謝

回答

0

你試過用正則表達式嗎? Python正則表達式匹配第三行,甚至使用pythons builtin .find()方法。由於您使用硒,您可以找到所有選項元素,遍歷每個元素,檢查每個元素的文本,並將其與您的字符串進行比較。

例如

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()

+0

會'm'給我的元素/文字? –

+0

m是匹配,如果你想打印文本元素,看到上面的更新,我現在要做的,不僅應該使正確的元素,假設硒找到所有的標籤,但如果你打印組(1)它應該打印紅色,毛茸茸,圍巾,小,英國 – reticentroot

+0

我剛使用過'如果m:element.click()' –

0

您可以從選項中獲取文本,然後比較您的文字,如下所示:

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()