为什么字符串比较“==”不起作用? Python 3.6
Why String comparison "==" doesn't work? Python 3.6
我正在尝试编写一个函数,该函数获取一个零件号,然后从该网站检索其产品网页 link:http://www.assmann-wsw.com
我正在使用 bs4 模块来解析网页。
url 在进行零件编号搜索时遵循以下结构:
"http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=" + part_number + "&artnr-search=find+now#searchresults"
这一行收集了'td'标签中的所有部件号。
all_artnr = soup.find_all('td', attrs={'class': 'artnr'})
搜索零件号的三种情况:
(1)。零件号不存在
(2)。零件号存在且不是其他零件号的子串。
(3)。零件号存在,它是其他零件号的子串。
场景(1)和(2)很容易处理。在场景 3 中,网站 returns 包含输入部件号作为子字符串的部件号的所有产品网页。
我正在考虑将 td 标签的文本与输入的零件号进行比较。当它们匹配时,产品网页包含在该 td 标签中。
下面是我的代码及其输出。
最后两个输出显示匹配,但比较 returns 错误。
请帮助我了解这里发生的事情。谢谢。
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
那是因为字符串不一样,打印出来的时候就是这样。
第一个包含 "NON-BREAKING HYPHEN",表示为 unicode 字符 '\u2011'
。第二个值包含一个 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
我正在尝试编写一个函数,该函数获取一个零件号,然后从该网站检索其产品网页 link:http://www.assmann-wsw.com
我正在使用 bs4 模块来解析网页。 url 在进行零件编号搜索时遵循以下结构:
"http://www.assmann-wsw.com/us/en/artikelfinder/?artnr=" + part_number + "&artnr-search=find+now#searchresults"
这一行收集了'td'标签中的所有部件号。
all_artnr = soup.find_all('td', attrs={'class': 'artnr'})
搜索零件号的三种情况:
(1)。零件号不存在
(2)。零件号存在且不是其他零件号的子串。
(3)。零件号存在,它是其他零件号的子串。
场景(1)和(2)很容易处理。在场景 3 中,网站 returns 包含输入部件号作为子字符串的部件号的所有产品网页。
我正在考虑将 td 标签的文本与输入的零件号进行比较。当它们匹配时,产品网页包含在该 td 标签中。
下面是我的代码及其输出。 最后两个输出显示匹配,但比较 returns 错误。 请帮助我了解这里发生的事情。谢谢。
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
那是因为字符串不一样,打印出来的时候就是这样。
第一个包含 "NON-BREAKING HYPHEN",表示为 unicode 字符 '\u2011'
。第二个值包含一个 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