2015-10-08 2 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-й предмет из выпадающего списка

Это может быть сделано с помощью какого-то матчи? Если да, как бы выбрать правильный элемент из выпадающего списка?

Thanks

ответ

0

Вы пытались использовать регулярное выражение ?? Python для соответствия третьей строке или даже с использованием встроенного метода pythons .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) он должен печатать красные, шерстяные, шарфные, маленькие, UK – reticentroot

+0

Я просто использовал 'if 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()