2017-02-14 4 views
0

Я использую urlopen и beautifulsoup4 для получения содержимого веб-страницы. Веб-страница Я извлекаю некоторые динамические блоки javascript. Я хотел бы извлечь содержимое целого массива.Извлечь элементы массива из html

Массив находится в следующем формате:

<script type="text/javascript"> 
var jobmap = {}; 
jobmap[0]= {jk:'929a2508c8bf2c9c',efccid: '28d4bd688c1e4e86',srcid:'4beb17a7fc4b64e2',cmpid:'be1c2a3db344744f',num:'0',srcname:'City of Oshawa',cmp:'City of Oshawa',cmpesc:'City of Oshawa',cmplnk:'/City-of-Oshawa-jobs-in-Ontario',loc:'Oshawa, ON',country:'CA',zip:'',city:'Oshawa',title:'Systems Analyst',locid:'da5ca33120fa5fe5',rd:'8i0xAbEkuWUhy6dasPEQkceDzWLtCZmZLj2Y-bGYlQI'}; 
jobmap[1]= {jk:'2d06bbaac441e7d2',efccid: 'beb412fe8b0feacc',srcid:'0a0f0bf6b7639c78',cmpid:'0c05d4e9f9f0206d',num:'1',srcname:'FGL Sports Ltd.',cmp:'FGL Sports Ltd.',cmpesc:'FGL Sports Ltd.',cmplnk:'/FGL-Sports-jobs-in-Ontario',loc:'Ontario',country:'CA',zip:'',city:'',title:'Decision Support Analyst',locid:'8b17acc5f001bdbf',rd:'v7_ZQyGHijdq7ng-cswbFDpj7KoE_Ia4YknbAcijYgE'}; 
</script> 

Массива содержит неизвестное количество элементов. Как я могу извлечь содержимое всего массива и сохранить его в json-объекте?

+0

Это [Object] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) не массив , – wpercy

+0

Если у вас есть динамический контент, Beautilsoup и urlopen - это неправильный способ подойти к проблеме –

+0

@ cricket_007 Я думаю, что это зависит .., иногда содержимое javascript присутствует в HTML (обычно в тегах скриптов), и имеет смысл перейти к " легкий "urlopen/requests, чтобы избежать накладных расходов и медлительности на основе браузера или javascript-движка. Хотя, здесь вещи, как правило, более хрупкие. Это, вероятно, не совсем «неправильно», но больше похоже на «использование с осторожностью и пониманием» :) – alecxe

ответ

2

BeautifulSoup может помочь решить только часть проблемы - найти нужный элемент script, содержащий нужный объект. Затем вам нужно будет использовать либо Javascript анализатор, как slimit или регулярные выражения, например, что-то вдоль этих линий:

import json 
import re 
from bs4 import BeautifulSoup 


data = """ 
<script type="text/javascript"> 
var jobmap = {}; 
jobmap[0]= {jk:'929a2508c8bf2c9c',efccid: '28d4bd688c1e4e86',srcid:'4beb17a7fc4b64e2',cmpid:'be1c2a3db344744f',num:'0',srcname:'City of Oshawa',cmp:'City of Oshawa',cmpesc:'City of Oshawa',cmplnk:'/City-of-Oshawa-jobs-in-Ontario',loc:'Oshawa, ON',country:'CA',zip:'',city:'Oshawa',title:'Systems Analyst',locid:'da5ca33120fa5fe5',rd:'8i0xAbEkuWUhy6dasPEQkceDzWLtCZmZLj2Y-bGYlQI'}; 
jobmap[1]= {jk:'2d06bbaac441e7d2',efccid: 'beb412fe8b0feacc',srcid:'0a0f0bf6b7639c78',cmpid:'0c05d4e9f9f0206d',num:'1',srcname:'FGL Sports Ltd.',cmp:'FGL Sports Ltd.',cmpesc:'FGL Sports Ltd.',cmplnk:'/FGL-Sports-jobs-in-Ontario',loc:'Ontario',country:'CA',zip:'',city:'',title:'Decision Support Analyst',locid:'8b17acc5f001bdbf',rd:'v7_ZQyGHijdq7ng-cswbFDpj7KoE_Ia4YknbAcijYgE'}; 
</script>""" 

soup = BeautifulSoup(data, "html.parser") 
script = soup.find("script", text=lambda text: "var jobmap" in text) 

pattern = re.compile(r"jobmap\[\d+\]\s*=\s*({.*?})") 
for item in pattern.findall(script.get_text(), re.MULTILINE): 
    print(item) 

Печатает:

{jk:'929a2508c8bf2c9c',efccid: '28d4bd688c1e4e86',srcid:'4beb17a7fc4b64e2',cmpid:'be1c2a3db344744f',num:'0',srcname:'City of Oshawa',cmp:'City of Oshawa',cmpesc:'City of Oshawa',cmplnk:'/City-of-Oshawa-jobs-in-Ontario',loc:'Oshawa, ON',country:'CA',zip:'',city:'Oshawa',title:'Systems Analyst',locid:'da5ca33120fa5fe5',rd:'8i0xAbEkuWUhy6dasPEQkceDzWLtCZmZLj2Y-bGYlQI'} 
{jk:'2d06bbaac441e7d2',efccid: 'beb412fe8b0feacc',srcid:'0a0f0bf6b7639c78',cmpid:'0c05d4e9f9f0206d',num:'1',srcname:'FGL Sports Ltd.',cmp:'FGL Sports Ltd.',cmpesc:'FGL Sports Ltd.',cmplnk:'/FGL-Sports-jobs-in-Ontario',loc:'Ontario',country:'CA',zip:'',city:'',title:'Decision Support Analyst',locid:'8b17acc5f001bdbf',rd:'v7_ZQyGHijdq7ng-cswbFDpj7KoE_Ia4YknbAcijYgE'} 

Обратите внимание, что каждый item значение не подлежит загрузке с json.loads(), посмотрите на использование demjson.decode() или каким-либо другим способом загрузить строки объекта javascript в P ython словари:

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