Как перебрать список JSON, чтобы найти только URL моего сайта? - PullRequest
1 голос
/ 22 октября 2019

Я извлекаю данные JSON со своего веб-сайта и хочу добавить URL-адреса (постоянные ссылки) всех моих сообщений в список. Я пытаюсь перебрать файл JSON, используя приведенный ниже код, но я получаю объект TypeError: 'list' не вызывается при попытке цикла for. Кто-нибудь может помочь?

import urllib.request
import json

get_data_url = "http://www.financialgenomeproject.net/wp-json/wp/v2/posts"
json_get_data_url = urllib.request.urlopen(get_data_url)
resp = json.load(json_get_data_url)

url_list = []
for i in resp('content'):
    if i('rendered') == 'href=':
        url_list.append(['href='])

print(url_list)

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

вам нужен только ключ Rendererd, потому что защищенный имеет тип bool. Затем вы можете использовать str.index, чтобы выбрать, какую часть строки выбрать.

import urllib.request
import json

get_data_url = "http://www.financialgenomeproject.net/wp-json/wp/v2/posts"
json_get_data_url = urllib.request.urlopen(get_data_url)
resp = json.load(json_get_data_url)

url_list=[]
for my_dict in resp:
    for key in my_dict['content']:
        if key == 'rendered':
            my_dict2=my_dict['content'][key]
            idi=my_dict2.index('href="http')+len('href="')
            idf=my_dict2.index('/"')+1
            url=my_dict2[idi:idf]
            url_list.append(url)
            print(url)

Вывод:

http://financialgenomeproject.net/2019/05/31/chapter-25-home-not-asset/
http://financialgenomeproject.net/2017/02/26/chapter-3-benjamin-franklin-first-tax-planner/
http://financialgenomeproject.net/table-of-contents/
http://financialgenomeproject.net/2018/11/30/chapter-22-land-ownership/
http://financialgenomeproject.net/about/
http://financialgenomeproject.net/2017/08/23/financial-genome-project-chapter-7/
http://financialgenomeproject.net/2017/09/24/financial-genome-project-chapter-8/
http://financialgenomeproject.net/2017/09/24/financial-genome-project-chapter-8/
http://financialgenomeproject.net/2016/12/09/financial-genome-project-1/
http://financialgenomeproject.net/2018/04/09/chapter-15-do-you-need-a-budget/

время, необходимое для получения URL

%%timeit
url_list=[]
for my_dict in resp:
    for key in my_dict['content']:
        if key == 'rendered':
            my_dict2=my_dict['content'][key]
            idi=my_dict2.index('href="http')+len('href="')
            idf=my_dict2.index('/"')+1
            url=my_dict2[idi:idf]
            url_list.append(url)
#27.4 µs ± 159 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

теперь с print

%%timeit
url_list=[]
for my_dict in resp:
    for key in my_dict['content']:
        if key == 'rendered':
            my_dict2=my_dict['content'][key]
            idi=my_dict2.index('href="http')+len('href="')
            idf=my_dict2.index('/"')+1
            url=my_dict2[idi:idf]
            url_list.append(url)
            print(url)
#1.42 ms ± 60.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

, как вы можете видеть, если включить print(url), время значительно увеличивается, поэтому было бы желательно прокомментировать эту строку, если вам не нужно просматривать ее сразу

0 голосов
/ 22 октября 2019

json, который вы загрузили, является списком, который вы сохранили в переменной resp. Вы не можете вызвать список, что resp('content') пытается сделать. Вместо этого просто перебираем список:

for i in resp:
    if i['rendered'] == 'href=':
        url_list.append(['href='])

Не то чтобы я также заменил ошибочное i('rendered') на i['rendered'].

Код в цикле не имеет особого смысла, чтобыбудь честным. Вы должны прочитать больше о том, как работает Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...