2016-07-18 2 views
1

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

results['file'] 

И это не сработало. Я получил сообщение об ошибке, говорящее, что-то вроде

it expected a number and instead got a string. 

я попытался

results[0] 

и все, что было возвращено

{ 

Я также попытался

results.file 

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

dict.values() 

, но когда я попробовал это я получил

'str' object has no attribute 'values' 

Heres мой код для моей функции

def panties(): 
     pan_url = 'http://www.panvideos.com' 
     html = requests.get(pan_url, headers=headers) 
     soup = BeautifulSoup(html.text, 'html5lib') 
     video_row = soup.find_all('div', {'class': 'video'}) 

     def youtube_link(url): 
      youtube_page = requests.get(url, headers=headers) 
      soupdata = BeautifulSoup(youtube_page.text, 'html5lib') 
      video_row = soupdata.find('div', {'class': 'video-player'}) 
      entries = [{'text': str(div), 
         } for div in video_row][3]['text'] 

      oldstring = str(entries) 
      removed = '<script type="text/javascript">jwplayer("video-setup").setup(' 
      newstring = oldstring.replace(removed, "") 
      removed_two = ');</script>' 
      newstring_two = newstring.replace(removed_two, "") 


      #Allows for multiple string replacement 
      rdict = { 
       'file': '"file"', 
       'image': '"image"', 
       'primary': '"primary"', 
       'stretching': '"stretching"', 
       'width': '"width"', 
       'aspectratio': '"aspectratio"', 
       'autostart': '"autostart"', 
       'logo': '"logo"', 
       'position': '"position"', 
       # 'link': '"link"', 
       'sharing': '"sharing"', 
      } 

      robj = re.compile('|'.join(rdict.keys())) 
      result = robj.sub(lambda m: rdict[m.group(0)], newstring_two) 
      parsed_json = json.loads(json.dumps(result)) 

      soc = parsed_json.replace('link', ' "link" ', 2) 

      return soc 

и вот что она возвращает

{"file":"http://www.youtube.com/watch?v=slCSLeZueI4", 
    "image":"http://i1.ytimg.com/vi/slCSLeZueI4/maxresdefault.jpg", 
    "primary":"html5", 
    "stretching":"fill", 
    "controlbar":"bottom", 
    "width":"100%", 
    "aspectratio":"16:9", 
    "autostart":"true", 
    "logo":{ 
     "file":"http://www.panvideos.com/uploads/bien-png578aab16676e1.png", 
     "position":"bottom-right", 
     "link" :"http://www.panvideos.com/"}, 
     "sharing":{ 
      "link" :"http://www.panvideos.com/video/3178/la-nina-y-el-lobo-video-oficial/","sites": 
     ["facebook","twitter","linkedin","pinterest","tumblr","googleplus","reddit"]}} 

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

EDIT: мой views.py

 pan = panties() 
     context = { 
      'pan': pan, 
     } 

и в моем шаблоне

{% for p in pan %} 
     Title: {{p.text}}<br> 
     Href: {{p.href}}<br> 
     Tube: {{p.tube}}<hr> 
    {% endfor %} 
+0

показать код, называющий эту функцию? Вы уверены, что положили возвращаемое значение в результатах? –

+1

Есть некоторые вещи, которые вы можете сделать, чтобы сузить это - ваш ' [] 'направо - и ваше сообщение об ошибке подсказывает, что, по вашему мнению, словарь является фактически строкой, ... –

+0

@ TonySuffolk66 благодарит за ответ , Если я пытаюсь использовать json.loads, я получаю это сообщение об ошибке «Ожидание», «разделитель: строка 1 столбец 436 (char 435)» – losee

ответ

0

В сообщении

'str' object has no attribute 'values' 

сообщает, что «результаты» - это строка. Вы можете использовать python-json для декодирования строки на объект python:

somevariable = json.loads(results) 
+0

спасибо за ответ. Я просто попробовал и получил следующее сообщение об ошибке «Ожидание», «разделитель: строка 1 столбец 436 (char 435)» – losee

+0

Итак, в строке 1 вашей строки json - в столбце 436 (или рядом с ним) вам не хватает ',' - сообщение очень ясно. –

+0

Где строки 436 и 435 не имеет смысла. – losee