【问题标题】:Python 3 int and string conversionsPython 3 int 和字符串转换
【发布时间】:2020-05-05 16:45:17
【问题描述】:

我有几个问题。只是为了解释这段代码中发生了什么,我正在获取一个 youtube 频道的订阅者数量,并尝试将其转换为一个 int 以便它可以进行乘法、除法等。

有没有办法在 .replace 方法中输入类似“. 后跟任意三个字符”的内容。这是因为某些 youtube 频道拥有“3.04 万”订阅者。当我从 HTML 中提取该字符串时,我希望能够将其转换为 int。这是第一个“if”语句,我想说“如果子计数有一个小数,后跟 3 个字符,即两个数字和字母,然后删除小数并用相应数量的零替换字母,根据到小数点的位置。如果后面没有 3 个字符,我想转到第一个“else”,它只会将字母的值降低 10 倍,而不是 100,因为小数点位置。最后,如果没有小数,我只是想将字母转换成常规数量的零。

我可能应该指出,我对 python 非常陌生,只使用了大约 3 天。之前的经验就像是 10 个小时的 java,我几乎忘记了。

感谢您提供的任何帮助!

subC = self.driver.find_element_by_xpath('/html/body/ytd-app/div/ytd-page-manager/ytd-browse/div[3]/ytd-c4-tabbed-header-renderer/app-header-layout/div/app-header/div[2]/div[2]/div/div[1]/div/div[1]/yt-formatted-string')
print('subscriber count is: ' + str(subC.text))

if ".XXX" in subC.text:
    subC.text.replace('k' , '0')
    subC.text.replace('M' , '0000')
    subC.tect.replace('B' , '0000000')
else:
    if "." in subC.text:
        subC.text.replace('k' , '00')
        subC.text.replace('M' , '00000')
        subC.text.replace('B' , '00000000')
        subC.text.replace('.' , '')
    else:
        subC.text.replace('k' , '000')
        subC.text.replace('M' , '000000')
        subC.text.replace('B' , '000000000')

(realSub, other) = subC.text.split(maxsplit=1)

print(int(realSub))

【问题讨论】:

    标签: python python-3.x string selenium int


    【解决方案1】:

    试试这个

    realsub = subC.text
    realsub.casefold()
    if realsub[-1].isalpha():
        last = realsub[-1]
        num = 1000 if last=='k' else 1000000 if last=='m' else 1000000000
        realsub = int(float(realsub[:-1])*num)
    print(realsub)
    

    casefold 将字符串转换为小写。如果最后一个字符是字母,则数字乘以所需的整数num

    【讨论】:

      【解决方案2】:

      使用正则表达式和字典,您可以实现所需的内容:

      import re
      d = {'M': 1000000, 'k': 1000, 'B': 1000000000}
      subC = ['3.04M', '5M', '3.4k']
      for sub in subC:
          if re.search('([a-zA-z])', sub ):
              match = re.search('([a-zA-z])', sub ).group(1) #Get the M
              subC2 = float(sub .replace(match,'')) # Remove the M and turn it into a float
      
              sub_number = int(subC2*d.get(match)) # Use dictionary to convert it to millions
          else:
              sub_number = int(subC)
          print(sub_number)
      

      也许我错过了您的一个案例,如果发生了这种情况或者您有什么不明白的地方,请告诉我。 只有如果你的字符串是子计数,这将起作用,如果不是这种情况,我可能需要进行一些修改。

      输出:

      3040000
      5000000
      3400
      

      【讨论】:

      • 我认为如果小数点后没有 2 个数字或根本没有小数点(即 3.4k 或 5M),您的解决方案可能不起作用。
      • @TobiasNöthlich,这是真的。我对其进行了简化,使其适用于这些场景,但假设字符串只是子计数,仅此而已
      【解决方案3】:

      您可以使用正则表达式来做到这一点。如果我理解正确,数字可以采用以下格式(k、M 或 B):

      • 3.04M
      • 3.4M
      • 3M

      要匹配第一种情况的“.XXX”格式,您可以使用

      import re
      
      if bool(re.search('\.[0-9][0-9].', subC)):
          subC = subC.text.replace('.','') 
          subC = subC.text.replace('k' , '0')
          subC = subC.text.replace('M' , '0000')
          subC = subC.text.replace('B' , '0000000')
      else:
          if "." in subC.text:
              subC = subC.text.replace('k' , '00')
              subC = subC.text.replace('M' , '00000')
              subC = subC.text.replace('B' , '00000000')
              subC = subC.text.replace('.' , '')
          else:
              subC = subC.text.replace('k' , '000')
              subC = subC.text.replace('M' , '000000')
              subC = subC.text.replace('B' , '000000000')
      subC = int(subC)
      

      请注意,您需要将替换某些内容的字符串显式分配给原始变量,因为它不会自动保存。
      另外一点,正则表达式的工作原理如下:

      • “\.”匹配。
      • "[0-9]" 匹配 0-9 之间的任意数字
      • “。”匹配任何字符

      【讨论】:

        猜你喜欢
        • 2013-03-04
        • 2017-10-12
        • 1970-01-01
        • 2021-12-25
        • 2011-04-26
        • 2013-11-21
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多