2014-06-09 3 views
5

से जोड़ा गया सामग्री मैं दूसरे यूआरएल से डेटा प्राप्त करना चाहता हूं जिसके लिए मैं urllib और सुंदर सूप का उपयोग कर रहा हूं, मेरा डेटा तालिका टैग के अंदर है (जिसे मैंने उपयोग किया है फ़ायरफ़ॉक्स कंसोल)। लेकिन जब मैंने अपनी आईडी का उपयोग करके टेबल लाने की कोशिश की तो परिणाम कोई नहीं है, तो मुझे लगता है कि इस तालिका को कुछ जेएस कोड के माध्यम से गतिशील रूप से जोड़ा जाना चाहिए।पायथन में स्क्रिप्ट टैग के अंदर चर के डेटा प्राप्त करें या जेएस

मैंने सभी दोनों पार्सर्स 'lxml', 'html5lib' की कोशिश की है लेकिन फिर भी मुझे वह तालिका डेटा नहीं मिल रहा है।

web = urllib.urlopen("my url") 
html = web.read() 
soup = BeautifulSoup(html, 'lxml') 
js = soup.find("script") 
ss = js.prettify() 
print ss 

परिणाम::

मैं भी एक और बात की कोशिश की है

<script type="text/javascript"> 
myPage = 'ETFs'; 
     sectionId = 'liQuotes'; //section tab 
     breadCrumbId = 'qQuotes'; //page 
     is_dartSite = "quotes"; 
     is_dartZone = "news"; 
     propVar = "ETFs"; 
</script> 

लेकिन अब मैं मैं इन js चर का डेटा कैसे प्राप्त कर सकते हैं पता नहीं है।

अब मेरे पास दो विकल्प हैं या तो उस तालिका सामग्री को प्राप्त करने के लिए जेएस चर, यह उनमें से कोई भी मेरा काम पूरा कर सकता है लेकिन दुर्भाग्य से मुझे नहीं पता कि इन्हें कैसे प्राप्त किया जाए, तो कृपया बताएं कि मैं किसी को कैसे हल कर सकता हूं समस्या में से एक

धन्यवाद

+1

अनुमान लगा जावास्क्रिप्ट तालिका सामग्री पैदा कर रहा है कि क्या करने का कोई मतलब नहीं है - आपको लगता है कि पहले इस बात की पुष्टि करने की जरूरत है। क्या यूआरएल सार्वजनिक रूप से सुलभ है? यदि ऐसा है, तो ये क्या है? – mhawke

+0

हां, मैं पुष्टि करता हूं कि जेएस कोड से टेबल डेटा जेनरेट किया गया है, आप यहां http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx देख सकते हैं। – Inforian

उत्तर

7

संपादित

यह डेटा निकालने के re मॉड्यूल का उपयोग कर और JSON के रूप में यह लोड हो रहा है चाल करना होगा:

import urllib 
import json 
import re 
from bs4 import BeautifulSoup 

web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx") 
soup = BeautifulSoup(web.read(), 'lxml') 
data = soup.find_all("script")[19].string 
p = re.compile('var table_body = (.*?);') 
m = p.match(data) 
stocks = json.loads(m.groups()[0]) 

>>> for stock in stocks: 
...  print stock 
... 
[u'ASPS', u'Altisource Portfolio Solutions S.A.', 116.96, 2.2, 1.92, 86635, u'N', u'N'] 
[u'AGNC', u'American Capital Agency Corp.', 23.76, 0.13, 0.55, 3184303, u'N', u'N'] 
. 
. 
. 
[u'ZION', u'Zions Bancorporation', 29.79, 0.46, 1.57, 2154017, u'N', u'N'] 

इस के साथ समस्या यह है कि स्क्रिप्ट टैग ऑफ़सेट हार्ड कोड किया गया है और पृष्ठ के भीतर इसे ढूंढने का कोई विश्वसनीय तरीका नहीं है। पृष्ठ में परिवर्तन आपके कोड को तोड़ सकता है।

मूल जवाब

बजाय स्क्रैप डेटा स्क्रीन करने के लिए प्रयास करते हैं, आप http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx?render=download से एक ही डेटा के एक सीएसवी प्रतिनिधित्व डाउनलोड कर सकते हैं।

फिर पाइथन csv मॉड्यूल का विश्लेषण और प्रक्रिया करने के लिए इसका उपयोग करें। न केवल यह अधिक सुविधाजनक है, यह एक अधिक लचीला समाधान होगा क्योंकि HTML में कोई भी परिवर्तन आसानी से आपके स्क्रीन स्क्रैपिंग कोड को तोड़ सकता है।

अन्यथा, यदि आप वास्तविक HTML को देखो तो आप पाएंगे कि डेटा निम्न स्क्रिप्ट टैग में पृष्ठ के भीतर उपलब्ध है:

<script type="text/javascript">var table_body = [["ATVI", "Activision Blizzard, Inc", 20.92, 0.21, 1.01, 6182877, .1, "N", "N"], 
["ADBE", "Adobe Systems Incorporated", 66.91, 1.44, 2.2, 3629837, .6, "N", "N"], 
["AKAM", "Akamai Technologies, Inc.", 57.47, 1.57, 2.81, 2697834, .3, "N", "N"], 
["ALXN", "Alexion Pharmaceuticals, Inc.", 170.2, 0.7, 0.41, 659817, .1, "N", "N"], 
["ALTR", "Altera Corporation", 33.82, -0.06, -0.18, 1928706, .0, "N", "N"], 
["AMZN", "Amazon.com, Inc.", 329.67, 6.1, 1.89, 5246300, 2.5, "N", "N"], 
.... 
["YHOO", "Yahoo! Inc.", 35.92, 0.98, 2.8, 18705720, .9, "N", "N"]]; 
+0

दरअसल, क्षमा करें, आपके द्वारा पोस्ट किए गए यूआरएल के लिए सीएसवी उपलब्ध नहीं है, इस मामले में आपको इसे जावास्क्रिप्ट चर से निकालना होगा।यह इस तरह दिखता है: '

2

बस की, @mhawke का जवाब बजाय हार्डकोड जोड़ने के लिए स्क्रिप्ट टैग का ऑफसेट, आप सभी स्क्रिप्ट टैग्स के माध्यम से लूप करते हैं और आपके पैटर्न से मेल खाते हैं;

web = urllib.urlopen("http://www.nasdaq.com/quotes/nasdaq-financial-100-stocks.aspx") 
pattern = re.compile('var table_body = (.*?);') 

soup = BeautifulSoup(web.read(), "lxml") 
scripts = soup.find_all('script') 
for script in scripts: 
    if(pattern.match(str(script.string))): 
     data = pattern.match(script.string) 
     stock = json.loads(data.groups()[0]) 
     print stock 
संबंधित मुद्दे