Как искать похожие строки на веб-странице? [Дубликат]

Ответ @PixelEinstein - это рабочий и принятый ответ, поскольку его идея ожидает, что элемент, на который влияет загрузка, будет устаревать или не будет найден сделал трюк. Наконец, я пришел к решению гораздо более простым способом, чем ожидалось. Мне нужно было просто подождать, пока поле ДОБАВЛЕНИЕ ADDRESS станет устаревшим, а затем снова вызовите «send_keys (« XYZ »)» в поле ДОСТУП АДРЕСА следующим образом:

driver.get("https://www.avis.co.in")
mySelect = Select(driver.find_element_by_id("DrpCity"))
mySelect.select_by_visible_text("Pune")
WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element_by_xpath("//input[@id='txtPickUp']")))
driver.find_element_by_xpath("//input[@id='txtPickUp']").send_keys("XYZ")

Обсуждение Как дождаться завершения метода __doPostBack в javascript? было полезно понять __doPostBack()

tl; dr

Sys.WebForms.PageRequestManager endRequest Event

8
задан martineau 27 July 2015 в 01:02
поделиться

5 ответов

Вы можете использовать difflib.sequencematcher , если вы хотите что-то из stdlib:

from difflib import SequenceMatcher
s_1 = 'Mohan Mehta'
s_2 = 'Mohan Mehte'
print(SequenceMatcher(a=s_1,b=s_2).ratio())
0.909090909091

fuzzywuzzy является одной из многочисленных библиотек, которые вы можете install, он использует модуль difflib с python-Levenshtein . Вы также должны проверить wikipage на Approximate_string_matching

11
ответ дан Padraic Cunningham 23 August 2018 в 23:43
поделиться
// calculate the similarity between 2 strings

  public static double similarity(String s1, String s2) {
    String longer = s1, shorter = s2;
    if (s1.length() < s2.length()) { // longer should always have greater length
      longer = s2; shorter = s1;
    }
    int longerLength = longer.length();
    if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
    /* // If you have StringUtils, you can use it to calculate the edit distance:
    return (longerLength - StringUtils.getLevenshteinDistance(longer, shorter)) /
                               (double) longerLength; */
    return (longerLength - editDistance(longer, shorter)) / (double) longerLength;

  }

  // Example implementation of the Levenshtein Edit Distance
  // See http://rosettacode.org/wiki/Levenshtein_distance#Java
  public static int editDistance(String s1, String s2) {
    s1 = s1.toLowerCase();
    s2 = s2.toLowerCase();

    int[] costs = new int[s2.length() + 1];
    for (int i = 0; i <= s1.length(); i++) {
      int lastValue = i;
      for (int j = 0; j <= s2.length(); j++) {
        if (i == 0)
          costs[j] = j;
        else {
          if (j > 0) {
            int newValue = costs[j - 1];
            if (s1.charAt(i - 1) != s2.charAt(j - 1))
              newValue = Math.min(Math.min(newValue, lastValue),
                  costs[j]) + 1;
            costs[j - 1] = lastValue;
            lastValue = newValue;
          }
        }
      }
      if (i > 0)
        costs[s2.length()] = lastValue;
    }
    return costs[s2.length()];
  }
-2
ответ дан Archit Garg 23 August 2018 в 23:43
поделиться

То, что вы хотите, - это расстояние до строки . Там много ароматов, но я бы рекомендовал начать с расстояния Левенштейна .

2
ответ дан fgregg 23 August 2018 в 23:43
поделиться

вы можете посмотреть на NLTK (набор инструментов Natural Language Toolkit), в частности на пакет nltk.metrics , который реализует различные алгоритмы строковых расстояний, включая упомянутое расстояние Левенштейна уже.

2
ответ дан Steven Kay 23 August 2018 в 23:43
поделиться

Другой подход заключается в использовании « фонетического алгоритма »:

Фонетический алгоритм является алгоритмом индексирования слов по их произношению.

< / blockquote>

Например, используя алгоритм soundex :

>>> import soundex
>>> s = soundex.getInstance()
>>> s.soundex("Umesh Gupta")
'U5213'
>>> s.soundex("Umash Gupte")
'U5213'
>>> s.soundex("Umesh Gupta") == s.soundex("Umash Gupte")
True
6
ответ дан Steven Kryskalla 23 August 2018 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: