为什么字符串比较" =="不工作? Python 3.6

时间:2017-04-11 04:28:24

标签: python html bs4

我正在尝试编写一个带有部件号的函数,然后从该网站检索其产品网页链接:http://www.assmann-wsw.com

我正在使用bs4模块来解析网页。 在进行部件号搜索时,网址遵循此结构:

" 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中,网站返回包含输入部件号的部件号的所有产品网页作为子字符串。

我正在考虑将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

1 个答案:

答案 0 :(得分:2)

那是因为字符串不一样,打印时它们只是这样。

第一个包含"非爆炸性的"它表示为unicode字符'\u2011'。第二个值包含ASCII hypen(" 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