Получение определенной части из исходного кода страницы

Я пытаюсь извлечь определенную часть со страницы с помощью регулярного выражения, но это не работает.

Это часть, которую я хочу извлечь со страницы:

{"clickTrackingParams":"CPcBEJhNIhMIwrDVo4qw3gIVTBnVCh28iAtzKPgd","commandMetadata":{"webCommandMetadata":{"url":"/service_ajax","sendPost":true}},"performCommentActionEndpoint":{"action":"CAUQAhoaVWd4MEdWUGNadTdvclcwT09WdDRBYUFCQWcqC1pNZlAzaERwdjlBMAA4AEoVMTA1MTc3MTgyMDc5MDg5MzQ1ODM4UACKAVQSC1pNZlAzaERwdjlBMixlaHBWWjNnd1IxWlFZMXAxTjI5eVZ6QlBUMVowTkVGaFFVSkJadyUzRCUzRMABAMgBAOABAaICDSj___________8BQAA%3D","clientActions":[{"updateCommentVoteAction":{"voteCount":{"accessibility":{"accessibilityData":{"label":"80 likes"}},"simpleText":"80"},"voteStatus":"LIKE"}}]}}

Пока я пробовал это:

import requests
import re


r = requests.get('http://rophoto.es/ash.txt')
html_source = r.text

mystrx = re.search(r'^{"clickTrackingParams".*"voteStatus":"LIKE"}}]}}', html_source)

но у меня не вышло.

пробовали BeautifulSoup? если у вас нет ограничений на пакеты, BS будет хорошо работать с парсингом веб-страниц

gavin 31.10.2018 12:30

На указанной веб-странице имеется много данных, соответствующих вашему шаблону. Это может быть проблемой.

SanthoshSolomon 31.10.2018 12:36
0
2
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

import requests
import re

r = requests.get('http://rophoto.es/ash.txt')
html_source = r.text

fst, snd = '{"clickTrackingParams":', '"voteStatus":"LIKE"}}]}}'

# Find first occurence
end = html_source.find(snd)

# Get closest index
start = max(idx.start() for idx in re.finditer(fst, html_source) if idx.start() < end)

print(html_source[start:end+len(snd)])

Какие выходы:

{"clickTrackingParams":"CPcBEJhNIhMIwrDVo4qw3gIVTBnVCh28iAtzKPgd","commandMetadata":{"webCommandMetadata":{"url":"/service_ajax","sendPost":true}},"performCommentActionEndpoint":{"action":"CAUQAhoaVWd4MEdWUGNadTdvclcwT09WdDRBYUFCQWcqC1pNZlAzaERwdjlBMAA4AEoVMTA1MTc3MTgyMDc5MDg5MzQ1ODM4UACKAVQSC1pNZlAzaERwdjlBMixlaHBWWjNnd1IxWlFZMXAxTjI5eVZ6QlBUMVowTkVGaFFVSkJadyUzRCUzRMABAMgBAOABAaICDSj___________8BQAA%3D","clientActions":[{"updateCommentVoteAction":{"voteCount":{"accessibility":{"accessibilityData":{"label":"80 likes"}},"simpleText":"80"},"voteStatus":"LIKE"}}]}}

Если вы хотите получить второй случай, вы можете попробовать что-то вроде:

import requests
import re

r = requests.get('http://rophoto.es/ash.txt')
html_source = r.text

fst, snd = '{"clickTrackingParams":', '"voteStatus":"LIKE"}}]}}'

def find_nth(string, to_find, n):
    """
    Finds nth match from string
    """

    # find all occurences
    matches = [idx.start() for idx in re.finditer(to_find, string)]

    # return nth match
    return matches[n]

# finds second match
end = find_nth(html_source, snd, 1)

# Gets closest index to end
start = max(idx.start() for idx in re.finditer(fst, html_source) if idx.start() < end)

print(html_source[start:end+len(snd)])

Примечание: Во втором примере вы можете столкнуться с IndexError, если вы запросите вхождение вне найденных совпадений. Вам нужно будет справиться с таким поведением самостоятельно.

значение clicktrackingparams не является статическим, оно генерируется динамически

elrich bachman 31.10.2018 13:02

@elrichbachman В файле есть 368 вхождения {"clickTrackingParams" и 10 вхождения "voteStatus":"LIKE"}}]}} ..... Я не уверен, как вы можете извлечь этот конкретный сегмент?

RoadRunner 31.10.2018 13:10

из этих 10 случаев "voteStatus": "LIKE"}}]}} я хочу получить первый, который упоминается в моем вопросе :( Мне нужна помощь, человек :( Если не регулярное выражение, то json можно было бы использовать, я думаю,

elrich bachman 31.10.2018 13:39

спасибо сработало как шарм, и я получил то, что хотел, также, если вы можете отредактировать и объяснить код, который был бы потрясающим :) большое спасибо, да благословит вас Бог

elrich bachman 31.10.2018 14:10

Привет, @roadrunner, как мне получить второй из этих 10 случаев? ваш код получает первый, как я могу получить второй, если я хочу? Благодарность

elrich bachman 01.11.2018 05:52

@elrichbachman Взгляните на мой второй пример. Вы можете создать свою собственную функцию, чтобы получить n-е вхождение. Если вы найдете все это полезным, я также был бы признателен, если бы вы также проголосовали за мой ответ.

RoadRunner 01.11.2018 06:04

Другие вопросы по теме