Python 3 преобразования int и string - PullRequest
0 голосов
/ 05 мая 2020

У меня пара вопросов. Чтобы объяснить, что происходит в этом коде, я беру счетчик подписчиков канала YouTube и пытаюсь преобразовать его в int, чтобы его можно было умножать, делить и т. Д. c.

Есть ли способ вставить что-то вроде «. С последующими любыми тремя символами» в методе .replace. Это связано с тем, что у некоторых каналов YouTube есть около 3,04 млн подписчиков. Когда я извлекаю эту строку из HTML, я хочу иметь возможность превратить ее в int. Это первый оператор «если», я пытаюсь сказать, «если в подсчете есть десятичная дробь, за которой следуют 3 символа, то есть два числа и буква, затем удалите десятичную дробь и замените буквы на соответствующее количество нулей в соответствии с к размещению десятичной дроби. Если после нее НЕ 3 символа, я хочу поставить go до первого "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))

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Попробуйте это

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.

1 голос
/ 05 мая 2020
• 1000 Это будет работать только , если ваша строка является подсчетом дополнительных, если это не так, мне могут потребоваться некоторые изменения.

Вывод:

3040000
5000000
3400
0 голосов
/ 05 мая 2020

Для этого вы можете использовать регулярные выражения. Если я правильно понял, числа могут быть в следующих форматах (с 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
  • "." соответствует любому символу
...