2017-04-11 3 views
0

Ich versuche, eine Funktion zu schreiben, die eine Teilnummer nimmt und ruft dann seine Produktseite Link von dieser Website: http://www.assmann-wsw.comWarum Stringvergleich "==" nicht funktioniert? Python 3.6

ich das BS4 Modul bin mit der Webseite zu analysieren. Die URL dieser Struktur folgt, wenn eine Teilenummer Suche zu tun:

"http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=" + part_number + "& artnr-search = finden + jetzt # Suchergebnis"

Diese Linie sammelt alle Teilenummern in 'td' tag .

all_artnr = soup.find_all('td', attrs={'class': 'artnr'}) 

Es gibt drei Szenarien, wenn eine Teilenummer suchen:

(1). Teilenummer existiert nicht

(2). Die Teilenummer existiert und es ist keine Teilzeichenkette anderer Teilenummern.

(3). Teilenummer existiert und es ist ein Teilstring anderer Teilenummern.

Die Szenarien (1) und (2) werden einfach gehandhabt. In Szenario 3 gibt die Website alle Produktwebseiten mit Teilenummern zurück, die die eingegebene Teilenummer als Teilzeichenfolge enthalten.

Ich dachte daran, den Text des td-Tags mit der Eingabe Teilenummer zu vergleichen. Wenn sie übereinstimmen, ist die Produktwebseite in diesem td-Tag enthalten.

Unten ist der Code, den ich habe und seine Ausgabe. Die letzten beiden Ausgaben zeigen eine Übereinstimmung, aber der Vergleich gibt false zurück. Bitte helfen Sie mir zu verstehen, was hier passiert. Vielen Dank.

import bs4 
import requests 


def get_pwp(pn): 
    home_page = "http://www.assmann-wsw.com/" 
    #url_p1_de = "http://www.assmann-wsw.com/wo/en/artikelfinder/?artnr=" 
    url_p1_us = "http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=" 
    url_p2 = "&artnr-search=find+now#searchresults" 

    search_url = url_p1_us + str(pn) + url_p2 
    src = requests.get(search_url).content 

    soup = bs4.BeautifulSoup(src, 'lxml') 

    # product webpage 
    pwp = '' 
    all_artnr = soup.find_all('td', attrs={'class': 'artnr'}) 

    # Part number doesn't exist 
    if len(all_artnr) == 0: 
     pwp = '#NA' 

    # Part number exists and it is not a substring of other part numbers. 
    elif len(all_artnr) == 2 or len(all_artnr) == 1: 
     pwp = home_page + all_artnr[0].find('a')['href'] 

    # Part number exists and it is a substring of other part numbers. 
    else: 
     for artnr in all_artnr: 
      print(str(artnr.text), pn) 
      print(str(artnr.text) == pn) 

      if str(artnr.text) == str(pn): 
       pwp = home_page + artnrfind('a')['href'] 
       break 

    return pwp 

pwp = get_pwp("A-MCSP-80300") 
print(pwp) 



Output: 

A‑MCSP‑80300‑R A-MCSP-80300 
False 
A‑MCSP‑80300‑R A-MCSP-80300 
False 
A‑MCSP‑80300/B A-MCSP-80300 
False 
A‑MCSP‑80300/B A-MCSP-80300 
False 
A‑MCSP‑80300/G A-MCSP-80300 
False 
A‑MCSP‑80300/G A-MCSP-80300 
False 
A‑MCSP‑80300/R A-MCSP-80300 
False 
A‑MCSP‑80300/R A-MCSP-80300 
False 
A‑MCSP‑80300/Y A-MCSP-80300 
False 
A‑MCSP‑80300/Y A-MCSP-80300 
False 
A‑MCSP‑80300 A-MCSP-80300 
False 
A‑MCSP‑80300 A-MCSP-80300 
False 


Process finished with exit code 0 

Antwort

2

Das liegt daran, dass die Saiten nicht gleich sind, sie schauen nur auf diese Weise, wenn Sie sie drucken.

Die erste enthält "NON-BREAKING HYPHEN", die als Unicode-Zeichen '\u2011' dargestellt wird. Der zweite Wert enthält ein ASCII-Hypenzeichen ("HYPHEN-MINUS"), '\u002D'.

>>> import unicodedata 
>>> s1 = 'A‑MCSP‑80300' 
>>> s2 = 'A-MCSP-80300' 

>>> s1 == s2 
False 

>>> s1.encode('utf8') 
b'A\xe2\x80\x91MCSP\xe2\x80\x9180300' 

>>> s2.encode('utf8') 
b'A-MCSP-80300' 

>>> unicodedata.name(s1[1]) 
'NON-BREAKING HYPHEN' 
>>> unicodedata.name(s2[1]) 
'HYPHEN-MINUS' 

Sie eine mit dem anderen vor dem Vergleich ersetzen könnte:

>>> s1.replace('\u2011', '-') == s2.replace('\u2011', '-') 
True 
+0

Danke mhawke. –