如何让python识别®符号

时间:2018-05-09 15:07:06

标签: python-2.7 unicode web-scraping

您好我在尝试将python识别®作为符号(如果它在这里没有显示那么好但是它是一个圆圈内的符号,称为'注册'符号) 我知道由于ASCII而在python中无法识别,但我想知道是否有人知道使用包含此符号的不同解码系统的方法或使python'忽略'它的方法。

对于某些情况: 我正在尝试为网站制作自动结帐程序,以便我的程序需要匹配用户想要的项目。要做到这一点,我使用Beatifulsoup来抓取信息但是这个符号'®'在一些导致python崩溃的项目的名称范围内。 这是我正在使用的当前命令,但由于ASCII而无效:

for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True):
CnI.append(str(colour.text))
Uhrefs.append(str(colour.get('href')))

任何帮助将不胜感激

到目前为止,这是整个程序(忽略乱七八糟的事情):

import time
import webbrowser
from selenium import webdriver
import mechanize
from bs4 import BeautifulSoup
import urllib2
from selenium.webdriver.support.ui import Select

CnI = []
item = []
colour = []
Uhrefs = []
Whrefs = []
FinalColours = []
selectItemindex = []
selectColourindex = []

#counters
Ccounter = 0
Icounter = 0
Splitcounter = 1

#wanted items suffix options:jackets, shirts, tops_sweaters, sweatshirts,     pants, shorts, hats, bags, accessories, skate
suffix = 'accessories'
Wcolour = 'Black'
Witem = '2-Tone Nylon 6-Panel'

driver=webdriver.Chrome()
driver.get('http://www.supremenewyork.com/shop/all/'+suffix)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
print(soup)

for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True):
    CnI.append(str(colour.text))
    Uhrefs.append(str(colour.get('href')))
    print(colour)


print('#############')

for each in CnI:
    each.split(',')
    print(each)







while Splitcounter<=len(CnI):
    item.append(CnI[Splitcounter-1])
    FinalColours.append(CnI[Splitcounter])
    Whrefs.append(Uhrefs[Splitcounter])
    Splitcounter+=2

print(Uhrefs)

for each in item:
    print(each)

for z in FinalColours:
    print(z)

for i in Whrefs:
    print(i)

##for i in item:
##    hold = item.index(i)
##    print(hold)
##    if Witem == i and Wcolour == FinalColours[i]:
##        print('correct')
##
##


for count,elem in enumerate(item):
    if Witem in elem:
        selectItemindex.append(count+1)


for count,elem in enumerate(FinalColours):
    if Wcolour in elem:
        selectColourindex.append(count+1)
print(selectColourindex)
print(selectItemindex)


for each in selectColourindex:
    if selectColourindex[Ccounter] in selectItemindex:
        point = selectColourindex[Ccounter]
        print(point)
    else:
        Ccounter+=1
web = 'http://www.supremenewyork.com'+Whrefs[point-1]
driver.get(web)





elem1 = driver.find_element_by_name('commit')
elem1.click()

time.sleep(1)

elem2 = driver.find_element_by_link_text('view/edit basket')
elem2.click()
time.sleep(1)

elem3 = driver.find_element_by_link_text('checkout now')
elem3.click()

2 个答案:

答案 0 :(得分:2)

BeautifulSoup返回Unicode字符串。停止将它们转换回字节字符串。处理文本时的最佳做法是:

  1. 将传入的文本解码为Unicode(BeautifulSoup正在做的事情)。
  2. 使用Unicode处理所有文本。
  3. 将传出文本编码为Unicode(文件,数据库,套接字等)。
  4. 您的问题的小例子:

    text = u'\N{REGISTERED SIGN}'  # syntax to create a Unicode codepoint by name.
    bytes = str(text)
    

    输出:

    Traceback (most recent call last):
      File "test.py", line 2, in <module>
        bytes = str(text)
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 0: ordinal not in range(128)
    

    注意第一行有效并支持该角色。将其转换为字节字符串失败,因为它默认为ASCII编码。您可以使用其他编码(例如bytes = text.encode('utf8')对其进行显式编码,但这会破坏上面的规则2并产生其他问题。

    建议阅读:

答案 1 :(得分:1)

“®”不是一个字符,而是一个unicode代码点,所以如果你使用的是Python2,你的代码将无法运行。不要使用str(),而是使用以下内容:

unicode(input_string, 'utf8')
# or
unicode(input_string, 'unicode-escape')

编辑:鉴于后面发布的初始片段周围的代码以及BeautifulSoup实际上已经返回unicode的事实,似乎删除str()可能是最好的行动方式,@ MarkTolonen的回答是现场 - 上。