【问题标题】:Selenium - Crawling a Spanish Website - UTF-8Selenium - 抓取西班牙网站 - UTF-8
【发布时间】:2015-12-24 15:11:26
【问题描述】:

我在潦草使用西班牙语字符的网站时遇到了麻烦。我编写了以下代码来生成网站用于其联赛的代码:

LEAGUES = ['Internacional', 'Inglaterra', 'España', 'Francia', 'Alemania', 'Italia', 'Holanda', 'Portugal', 'Australia',
           'Bélgica', 'Egipto', 'Grecia', 'Omán', 'Irán', 'Japón', 'Kuwait', 'Marruecos', 'Arabia Saudí', 'Escocia', 'Turquía',
           'Irlanda del Norte', 'Dinamarca', 'Rusia', 'Emiratos Árabes', 'Gales', 'Túnez', 'Noruega', 'Suecia', 'Argelia', 'Israel']

def codes_generator():
    """
    generates dictionary containing codes for every division available
    """
    codes = defaultdict(dict)
    driver = selenium.webdriver.Chrome(executable_path='/media/Data.II/Dropbox/Projects/football-bidder/utils/chromedriver')
    driver.get('https://www.miljugadas.com/es-ES/sportsbook')
    driver.find_element_by_class_name('sport_240').click()
    for league in LEAGUES:
        try:
            league = driver.find_element_by_link_text(league)
            league.click()
        except selenium.common.exceptions.NoSuchElementException as e:
            continue
        divisions = league.find_element_by_xpath("parent::*").find_elements_by_tag_name('li')
        for division in divisions:
            division = division.find_element_by_tag_name('a')
            division_code = division.get_attribute('data-id')
            division_name = division.text
            codes[league.text][division_name] = division_code
    return codes


{u'B\xe9lgica': {u'B\xe9lgica - Jupiler League': u'52995'}, u'Espa\xf1a': {u'Espa\xf1a - Liga BBVA': u'23170', u'Espa\xf1a - Copa del Rey': u'67954'}, u'Kuwait': {u'Kuwait \u2013 Liga': u'128783'}, u'Holanda': {u'Holanda - Eredivisie': u'47282'}, u'Irlanda del Norte': {u'Irlanda del Norte - Premier': u'57274'} u'Grecia': {u'Grecia - Super Liga': u'53509'}}

它返回一个很难管理的字典。我无法穿越像西班牙这样使用特殊西班牙字符的联赛。

【问题讨论】:

  • Python 2 还是 3?很重要
  • 那么问题是什么?
  • Python 2. 如何使用特殊字符存储所有内容。我希望字典键是 Bélgica 和 España 而不是 B\xe9lgica 和 Espa\xf1a

标签: python selenium encoding utf-8


【解决方案1】:

u'B\xe9lgica' 只是 Unicode 字符串的安全表示。 \xe9 == Unicode U+00E9 == é (http://www.fileformat.info/info/unicode/char/e9/index.htm)。

如果您要将 Unicode 对象打印到兼容的控制台,那么您会看到正确的字符。

您还可以使用带有io 模块的编码TextWrapper 将Unicode 对象保存到文件中。这允许您将其保存为 UTF-8。

以下是两者都做的例子:

with io.open("myoutfile.txt", "w", encoding="UTF-8") as my_file:
     for (league, division) in codes_generator().items():
         print league
         my_file.write(league) 

【讨论】:

    【解决方案2】:

    您的问题似乎与编码有关。 我建议你:

    • 使用编码注释明确声明代码中使用的编码

    • 将 Unicode [u 'string'] 字符串转换为字符串,就像 in this question 所做的那样:

      es_string = "mañana"
      es_string.encode("ascii")
      es_string.encode("latin-1")
      es_string.encode("utf-8")
      

    【讨论】:

    • 最好只在输出时将 Unicode 转换为 str()。我不明白您为什么要尝试使用这么多不同的编解码器对 Unicode 进行编码。 es_string.encode("ascii") 肯定会失败!
    • 我只是列出了一些例子,以便让他选择他喜欢的编码..这不是为了混淆!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多