Извлечение URL из файла json - PullRequest
1 голос
/ 22 января 2020

Я использовал почтальон, чтобы получить URL-адреса из API, чтобы я мог посмотреть на некоторые названия. Ответ был сохранен как файл. json.

Фрагмент моего ответа. Файл json выглядит следующим образом:

{
    "apiUrl":"https://api.ft.com/example/83example74-3c9b-11ea-a01a-example547046735",
    "title": {
        "title": "Example title example title example title"
    },
    "lifecycle": {
        "initialPublishDateTime":"2020-01-21T22:54:57Z",
        "lastPublishDateTime":"2020-01-21T23:38:19Z"
    },
    "location":{
        "uri":"https://www.ft.com/exampleurl/83example74-3c9b-11ea-a01a-example547046735"
    },
    "summary": "...",
    # ............(this continues for all different titles I found)
}

Поскольку я хочу просмотреть статьи, я хочу создать список всех URL-адресов. Меня не интересует apiUrl, а только URI.

Мой текущий python файл выглядит следующим образом

with open ("My path to file/response.json") as file:
    for line in file:
        urls = re.findall('https://(?:[-\www.]|(?:%[\da-fA-F]{2}))+', line)
        print(urls)

Это дает мне следующий вывод: ['https://api.ft.com', 'https://www.ft.com', 'https://api.ft.com', 'https://www.ft.com',........

Тем не менее, я хочу видеть полный URL для www.ft.com (поэтому не URL api.ft.com, так как я не заинтересован в них). Например, я хочу, чтобы моя программа извлекала что-то вроде: https://www.ft.com/thisisanexampleurl/83example74-3c9b-11ea-a01a-example547046735

Я хочу, чтобы программа делала это для всего файла ответов

Кто-нибудь знает способ сделать это?

Вся помощь будет оценена. Raymond

Ответы [ 4 ]

0 голосов
/ 24 января 2020

Спасибо за вклад всех.

Я нашел другой способ решить мою проблему (я использовал newsapi для python. По сути, сделал то же самое, но вместо этого, чтобы посмотреть только на финансовое время API я сейчас получить больше сайтов и статей). Для меня это работало лучше

Раймонд ван Зонневельд

0 голосов
/ 22 января 2020

Предполагая, что URL-адреса разбросаны по всему объекту json, вы можете рекурсивно искать каждое значение вложенных объектов по каждому ключу, чтобы определить, является ли его URL-адрес.

Кроме того, если он правильно отформатирован json при использовании json.loads поиск будет намного проще, чем в файловом объекте.

Например, при использовании python валидаторов package

import validators

Iterate through the object.

Check each value with -> `validators.url(value)`

If True -> return value
0 голосов
/ 23 января 2020

Если вы уверены, что ключи содержат URL, вы можете использовать библиотеку nested_lookup для их получения:

from nested_lookup import nested_lookup

urls = []
for key in ('uri', 'apiUrl'):
    urls.extend(nested_lookup(key, data))
print(urls)

# ['https://www.ft.com/exampleurl/83example74-3c9b-11ea-a01a-example547046735', 'https://api.ft.com/example/83example74-3c9b-11ea-a01a-example547046735']
0 голосов
/ 22 января 2020

Есть много способов извлечь снизу простейшее представление о нем

str_='first url "https://api.ft.com/example/83example74-3c9b-11ea-a01a-example547046735" plus second url "https://www.ft.com/exampleurl/83example74-3c9b-11ea-a01a-example547046735'
import re
re.findall("(?P<url>https?://[^\s]+)", str_)
Output=
['https://api.ft.com/example/83example74-3c9b-11ea-a01a-example547046735"', 'https://www.ft.com/exampleurl/83example74-3c9b-11ea-a01a-example547046735']
...