Python, Web Parsing

Я смотрел учебник по веб-разбору на python . Это код для получения данных о реальных запасах . И код работает нормально .

   import re
   import urllib.request

    # https://www.google.com/finance?q=
    url = "https://www.google.com/finance?q="
    stock = input("Enter Your Stock : ")
    url = url + stock
    data = urllib.request.urlopen(url).read()
    newData = data.decode('utf-8')
    # meta itemprop="price"
    m = re.search('meta itemprop="price"', newData)
    start = m.start()
    end = start + 50
    newStock = newData[start:end]
    m = re.search('content="', newStock)
    start = m.end()
    newStock1 = newStock[start:]
    m = re.search('/', newStock1)
    start = 0
    end = m.end() - 3
    final = newStock1[0:end]
    print("The Value Of " + stock + " Is " + final)

Но я не понимаю эти две части в коде :

    start = m.start()
     end = start + 50  # Why + 50 ?

    start = 0
   end = m.end() - 3   # Why - 3 ?

Кто-нибудь может мне объяснить ? Пожалуйста, подробно

1 ответ

  1. Итак, первый вопрос:

    start = m.start()
    end = start + 50 # Why + 50?
    

    Для того, чтобы легче понять, почему +50 есть, вам нужно смотреть немного вперед и немного после:

    newData = data.decode('utf-8')
    # meta itemprop="price"
    m = re.search('meta itemprop="price"', newData)
    start = m.start()
    end = start + 50
    newStock = newData[start:end]
    

    Строка за строкой:

    • newData содержит представление UTF-8 искомой страницы (например https://www.google.com/finance?q=aapl если мы пытаемся получить стоимость акций Apple).

    • m является ли объект match: где в newDataвозникновении meta itemprop="price"начинается, где заканчивается + куча другой информации (более подробную информацию смотрите в документации: python2, python3)

    • start затем позицияnewData, в которой начинается матч

    • end если start + 50, потому что это предполагаемая максимальная длина HTML-элемента, содержащего цену. Например, если я смотрю на Apple, то есть:
      <meta itemprop="price" content="116.73" />, длина которого составляет 42 символа.

    • newStock сейчас будет meta itemprop="price" content="116.73" />

    Переходим ко второму вопросу:

    start = 0
    end = m.end() - 3   # Why - 3 ?
    

    Как и в предыдущем примере, давайте получим немного больше контекста:

    newStock = newData[start:end]
    m = re.search('content="', newStock)
    start = m.end()
    newStock1 = newStock[start:]
    m = re.search('/', newStock1)
    start = 0
    end = m.end() - 3
    final = newStock1[0:end]
    

    Строка за строкой:

    • Мы уже упоминали, что newStockтеперь будет meta itemprop="price" content="116.73" />

    • m является объектом соответствия для нового regex: где в newStockпоявлении content="начинается, заканчивается и т.д.

    • start это конец матча

    • newStock1 затем подстрокаnewStock, которая начинается с первого символа после content="и заканчивается в конце строки, так newStock1что 116.73" />

    • …последний регекс!

    • start назначается0, но больше не используется

    • end это m.end() - 3потому, что мы знаем , что есть ровно три символа от конца числа (значение запаса) до /символа (включая символ):", и /.

    Надеюсь, это поможет!