2017-04-11 8 views
0

私は部品番号を受け取り、その後、このウェブサイトから、その製品のWebページのリンクを取得する関数を記述しようとしています:http://www.assmann-wsw.comなぜ文字列比較 "=="が機能しないのですか? Pythonの3.6

私は、Webページを解析するBS4モジュールを使用しています。パーツ番号検索実行時に URLは、この構造を、以下:

http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=」+ PART_NUMBER +「& artnr検索を= +見つける今#にsearchResults」

この行は、「TD」タグ内のすべての部品番号を収集し、 。

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

品番検索する際の3つのシナリオがあります

(1)。部品番号は存在しません

(2)部品番号が存在し、他の部品番号の部分文字列ではありません。

(3)。部品番号が存在し、他の部品番号の部分文字列です。

シナリオ(1)と(2)は簡単に処理されます。シナリオ3では、ウェブサイトは、入力部品番号を含む部品番号のすべての製品ウェブページを部分文字列として返す。

私は、tdタグのテキストを入力部品番号と比較することを考えていました。一致すると、そのWebページはそのtdタグに含まれます。

以下は私が持っているコードとその出力です。 最後の2つの出力は一致を示しますが、比較結果はfalseを返します。 ここで何が起こっているのか理解してください。ありがとうございました。

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 

答えて

2

これは文字列が同じではないためです。文字列が同じでないため、印刷したときのように見えます。

最初には、 "NON-BREAKING HYPHEN"が含まれています。これは、ユニコード文字'\u2011'で表されます。 2番目の値には、ASCIIハイフン( "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' 

あなたは比較する前に他のものを置き換えることができます:

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

をあなたはmhawkeありがとうございます。 –

関連する問題