2015-09-22 1 views
1

У меня есть объект JSON:извлекая JSON объект из HTML <script>

{ 
    "review_body": "Beef noodles realism weathered modem tanto hotdog dolphin long-chain hydrocarbons 8-bit euro-pop tank-traps Tokyo narrative.-space j-pop franchise otaku faded RAF girl artisanal hotdog denim ablative systemic smart-Kowloon. Man construct dome smart-computer pen monofilament beef noodles rain garage geodesic bicycle San Francisco wonton soup dissident nodal point tower. Boat uplink film dead man modem warehouse. Nodal point jeans euro-pop render-farm nano-fetishism semiotics hacker gang. Futurity narrative youtube otaku Kowloon free-market drugs. Fluidity assassin Tokyo bicycle media assault concrete industrial grade ablative lights boat BASE jump A.I. post-stimulate carbon. Physical computer narrative city youtube math-neural assassin modem.", 
    "link": "http://www.getlost.com/store/acme/review/10607787#comment10607787", 
    "seller_id": "104523", 
    "survey_id": "9933447", 
    "loggedin_user": 0, 
    "store_rating": "8.02", 
    "store_thumb": "http://www.getlost.com/store/thumbnail/acme.jpg", 
    "store_name": "acme", 
    "username": "ronin666", 
    "rating": "1", 
    "ref": "RR,acme,104523" 
} 

внедренный в

<script LANGUAGE="javascript"> 
window.commentShare = $.extend((window.commentShare || {}), { 
    10607787: { 
     "review_body": "Beef noodles realism weathered modem tanto hotdog dolphin long-chain hydrocarbons 8-bit euro-pop tank-traps Tokyo narrative.-space j-pop franchise otaku faded RAF girl artisanal hotdog denim ablative systemic smart-Kowloon. Man construct dome smart-computer pen monofilament beef noodles rain garage geodesic bicycle San Francisco wonton soup dissident nodal point tower. Boat uplink film dead man modem warehouse. Nodal point jeans euro-pop render-farm nano-fetishism semiotics hacker gang. Futurity narrative youtube otaku Kowloon free-market drugs. Fluidity assassin Tokyo bicycle media assault concrete industrial grade ablative lights boat BASE jump A.I. post-stimulate carbon. Physical computer narrative city youtube math-neural assassin modem.", 
     "link": "http:\/\/www.getlost.com\/store\/acme\/review\/10607787#comment10607787", 
     "seller_id": "104523", 
     "survey_id": "9933447", 
     "loggedin_user": 0, 
     "store_rating": "8.02", 
     "store_thumb": "http:\/\/www.getlost.com\/store\/thumbnail\/acme.jpg", 
     "store_name": "acme", 
     "username": "ronin666", 
     "rating": "1", 
     "ref": "RR,acme,104523" 
    } 
}); 
</script> 

Я хотел бы, чтобы извлечь вышеупомянутый объект JSON. Как это можно достичь? Должен ли я использовать регулярные выражения?

Как этот тип объекта может быть получен (через IPython, питон 2.7):

Я был в основном выскабливание обзор сайта resellerratings.com для произвольного магазина с использованием BeautifulSoup. Я получил объект супа и заметил, что есть полезные объекты JSON, содержащие информацию для каждого обзора в выбранном магазине. Однако при вызове soup.find("script", language = "javascript") у меня все еще остается объект JSON, встроенный в теги скриптов.

from mechanize import Browser 
import bs4 
from bs4 import BeautifulSoup 

br = Browser() 
br.set_handle_robots(False) 
br.set_handle_refresh(False) 

example_url = 'http://www.resellerratings.com/store/My_Digital_Palace' 

response = br.open(example_url) 
soup = BeautifulSoup(response) 
soup.find("script", language = "javascript") 

Это должно вернуть:

<script language="javascript"> 
window.commentShare = $.extend(
    (window.commentShare || {}), { 
     375015: { 
      "review_body": "I bought a Kodak LS443 form My Digital Palace in 2004. I also purchased a 5 year warranty. Now the camera does not work and I am unable to contact them. What do I do??? Am I just screwed???<br><br>Margaret Fuller<br>[email protected]", 
      "link": "http:\/\/www.resellerratings.com\/store\/My_Digital_Palace\/review\/375015#comment375015", 
      "seller_id": "6930", 
      "survey_id": "385176", 
      "loggedin_user": 0, 
      "store_rating": "1.00", 
      "store_thumb": "http:\/\/www.resellerratings.com\/store\/thumbnail\/My_Digital_Palace.jpg", 
      "store_name": "My Digital Palace", 
      "username": "maf1059", 
      "rating": "1", 
      "ref": "RR,My_Digital_Pala,6930" 
     } 
    } 
); 
</script> 
+0

Вы рассматриваете это как обычный текстовый файл, который вы хотите разобрать или он включен в ваше веб-приложение? – ergonaut

+0

@ergonaut Это на самом деле то, что я царапал, используя красивый суп в питоне. Так что я хочу разобрать. –

+1

Почему вы не просто получаете доступ к объекту переменной? – Nit

ответ

2

Если у вас есть эта JOSN на странице и хотите получить доступ к нему с помощью JavaScript, вы можете сделать это с помощью цикла, хотя объект (ы) в окне. Объект commentShare.

Вот небольшая тестовая функция, которую вы можете добавить на свою страницу, чтобы вы могли видеть, как это будет работать. Он будет предупреждать одно из ваших значений JSON. Для полноты я добавил его в конец вашего примера.

<script LANGUAGE="javascript"> 
window.commentShare = $.extend((window.commentShare || {}), { 
    10607787: { 
     "review_body": "Beef noodles realism weathered modem tanto hotdog dolphin long-chain hydrocarbons 8-bit euro-pop tank-traps Tokyo narrative.-space j-pop franchise otaku faded RAF girl artisanal hotdog denim ablative systemic smart-Kowloon. Man construct dome smart-computer pen monofilament beef noodles rain garage geodesic bicycle San Francisco wonton soup dissident nodal point tower. Boat uplink film dead man modem warehouse. Nodal point jeans euro-pop render-farm nano-fetishism semiotics hacker gang. Futurity narrative youtube otaku Kowloon free-market drugs. Fluidity assassin Tokyo bicycle media assault concrete industrial grade ablative lights boat BASE jump A.I. post-stimulate carbon. Physical computer narrative city youtube math-neural assassin modem.", 
     "link": "http:\/\/www.getlost.com\/store\/acme\/review\/10607787#comment10607787", 
     "seller_id": "104523", 
     "survey_id": "9933447", 
     "loggedin_user": 0, 
     "store_rating": "8.02", 
     "store_thumb": "http:\/\/www.getlost.com\/store\/thumbnail\/acme.jpg", 
     "store_name": "acme", 
     "username": "ronin666", 
     "rating": "1", 
     "ref": "RR,acme,104523" 
    } 
}); 

function test(){ 

for (var i in window.commentShare) { 
    var myObj = window.commentShare[i]; 
    alert(myObj.review_body); 
} 

} 
test(); 

</script> 
3

Простой, просто выньте обертку и посторонние линии, чтобы добраться до сочного, сочного JSON. Ниже удаляет первые четыре строки, а последние три вашего javscript сниппета (в то же время положить первоначальный { назад в том, что заблудился):

import json 

raw = "{" + "\n".join(str(soup.find("script")).split("\n")[4:-3]) 

Если <script> объекты на странице не записываются в форме (то есть не всегда точно первые четыре строки, а последние два - посторонние), вам, возможно, придется прибегать к регулярному выражению или другому совпадению. После этого вы можете перейти к JSON.

json_obj = json.loads(raw) 

Ваша проблема была просто проблемой регулярного выражения/расщепления. Я думаю, что люди были немного отброшены Javascript. :)

Смежные вопросы