2017-04-11 60 views
0

我試圖寫一個函數,零件編號,然後檢索從本網站的產品網頁鏈接:http://www.assmann-wsw.com爲什麼字符串比較「==」不起作用? Python的3.6

我使用BS4模塊解析網頁。做一個零件號搜索時 的網址如下這種結構:

http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=」 + PART_NUMBER +「& artnr物品搜索=找到+現在#SearchResult所」

此行收集了所有的零件編號在「TD」標籤。

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

有三種情況搜索部件編號時:

(1)。部件號不存在

(2)。部件號存在,它不是其他部件號的子字符串。

(3)。部件號存在,它是其他部件號的子字符串。

方案(1)和(2)很容易處理。在場景3中,網站將包含輸入部件號的部件號的所有產品網頁作爲子串返回。

我在想比較td標籤的文本和輸入零件編號。當它們匹配時,產品網頁將包含在該td標籤中。

下面是我有的代碼和它的輸出。 最後兩個輸出顯示匹配,但比較返回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

這是因爲字符串不一樣,它們只是在你打印它們時看起來那樣。

第一個包含「非破壞性字母」,它表示爲Unicode字符'\u2011'。第二個值包含一個ASCII henn(「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。 –