2010-04-02 39 views
11

मैं वेब पेजों की एक श्रृंखला से HTML के एक हिस्से को निकालने के लिए YQL का उपयोग करने का प्रयास कर रहा हूं। पृष्ठों में स्वयं की थोड़ी अलग संरचना होती है (इसलिए इसकी "कट सामग्री" सुविधा के साथ एक याहू पाइप्स "फ़ेच पेज" अच्छी तरह से काम नहीं करता है) लेकिन जिस टुकड़े में मुझे रूचि है, वह हमेशा class विशेषता है।क्या YQL को HTML वापस करने का कोई तरीका है?

अगर मैं इस तरह एक HTML पृष्ठ है:

<html> 
    <body> 
    <div class="foo"> 
     <p>Wolf</p> 
     <ul> 
     <li>Dog</li> 
     <li>Cat</li> 
     </ul> 
    </div> 
    </body> 
</html> 

और इस तरह एक YQL अभिव्यक्ति का उपयोग:

SELECT * FROM html 
WHERE url="http://example.com/containing-the-fragment-above" 
AND xpath="//div[@class='foo']" 

क्या मैं वापस पाने के डोम तत्वों, जहां (जाहिरा तौर पर अव्यवस्थित?) कर रहे हैं मैं चाहता हूं कि HTML सामग्री स्वयं ही हो। मैंने SELECT content भी कोशिश की है, लेकिन यह केवल पाठ्य सामग्री का चयन करता है। मुझे एचटीएमएल चाहिए क्या यह संभव है?

उत्तर

8

आप एक सामान्य YQL html तालिका क्वेरी और stringify परिणाम बाहर भेजने के लिए एक छोटे से Open Data Table लिख सकते हैं। निम्नलिखित की तरह कुछ:

<?xml version="1.0" encoding="UTF-8" ?> 
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> 
    <meta> 
    <sampleQuery>select * from {table} where url="http://finance.yahoo.com/q?s=yhoo" and xpath='//div[@id="yfi_headlines"]/div[2]/ul/li/a'</sampleQuery> 
    <description>Retrieve HTML document fragments</description> 
    <author>Peter Cowburn</author> 
    </meta> 
    <bindings> 
    <select itemPath="result.html" produces="JSON"> 
     <inputs> 
     <key id="url" type="xs:string" paramType="variable" required="true"/> 
     <key id="xpath" type="xs:string" paramType="variable" required="true"/> 
     </inputs> 
     <execute><![CDATA[ 
var results = y.query("select * from html where [email protected] and [email protected]", {url:url, xpath:xpath}).results.*; 
var html_strings = []; 
for each (var item in results) html_strings.push(item.toXMLString()); 
response.object = {html: html_strings}; 
]]></execute> 
    </select> 
    </bindings> 
</table> 

फिर आप की तरह एक YQL क्वेरी के साथ कि कस्टम तालिका के खिलाफ क्वेरी सकता है:

use "http://url.to/your/datatable.xml" as html.tostring; 
select * from html.tostring where 
    url="http://finance.yahoo.com/q?s=yhoo" 
    and xpath='//div[@id="yfi_headlines"]/div[2]/ul/li' 

संपादित करें: बस महसूस किया कि यह एक बहुत पुराना है सवाल था कि टक्कर लगी थी; कम से कम एक जवाब यहां है, आखिरकार, किसी को भी सवाल पर ठोकर खा रहा है। :)

+0

सुंदर! धन्यवाद। मेरे पास अब एकमात्र मुद्दा यह है कि याहू पाइप्स वैरिएबल को YQL अभिव्यक्ति में कैसे प्राप्त किया जाए। उदाहरण के लिए, चयन * html.tostring जहां url = item.link और से xpath = '// div [@ आईडी = "foo"]' वापस त्रुटि देता है "अवैध identfier item.link। मैं हूँ इस संदर्भ में एकमात्र समर्थित पहचानकर्ता। " कोई विचार मैं यह कैसे करता हूं? (कुचले हुए कोड स्निपेट के लिए खेद है, टिप्पणियों की तरह दिखता है प्रारूपण के तरीके में ज्यादा अनुमति नहीं देता है) –

+0

इसका उत्तर पता चला: एक अलग पाइप बनाएं जो एक यूआरएल इनपुट लेता है, जो एक स्ट्रिंग बिल्डर में बनाता है जो बनाता है YQL क्वेरी, और YQL विजेट को क्वेरी के रूप में संलग्न करें। फिर अपने मुख्य पाइप में, इस नई पाइप का उपयोग करें और यूआरएल में इनपुट के रूप में पास करें। मुझे लगता है कि मैं शायद इस के लिए एक नया प्रश्न खोलूंगा ताकि लोगों को इसकी टिप्पणियों में इसका शिकार न करना पड़े। –

+0

खोला गया: http://stackoverflow.com/questions/2889406/how-do-i-pass-a-yahoo-pipes-item-into-a-yql-query –

0

YQL पृष्ठ को एक्सएमएल में परिवर्तित करता है, फिर उस पर आपका XPath करता है, फिर DOMNodeList लेता है और आपके आउटपुट के लिए वापस XML पर क्रमबद्ध करता है (और फिर आवश्यक होने पर JSON में परिवर्तित होता है)। आप मूल डेटा तक नहीं पहुंच सकते हैं।

आप एचटीएमएल के बजाय एक्सएमएल से क्यों निपट नहीं सकते?

+0

मैं इसका उपयोग याहू पाइप्स के संदर्भ में कर रहा हूं, इसलिए मैं एक फीड रीडर/ब्राउज़र द्वारा आरएसएस फ़ीड में आरएसएस फ़ीड डालना चाहता हूं। एक्सएमएल डालने से काम हो सकता है, लेकिन पाइप्स वाईक्यूएल मॉड्यूल सिर्फ दस्तावेज़ में डीओएम तत्वों को सम्मिलित करता है; मुझे एक्सएमएल स्रोत प्राप्त करने का कोई तरीका नहीं दिख रहा है। –

2

मुझे यह वही सटीक समस्या थी। मेरे आस-पास एकमात्र तरीका यह है कि YQL से बचें और प्रारंभ और अंत टैग से मेल खाने के लिए नियमित अभिव्यक्तियों का उपयोग करें: /। सबसे अच्छा समाधान नहीं है, लेकिन यदि एचटीएमएल अपेक्षाकृत अपरिवर्तनीय है, और पैटर्न केवल <div class='name'> से <div class='just_after> 'कहने से है, तो आप इससे दूर हो सकते हैं। फिर आप के बीच एचटीएमएल प्राप्त कर सकते हैं।

+0

हाँ, यही वह है जो मैंने भी किया। दुर्भाग्यवश पृष्ठ की संरचना किस प्रकार की प्रविष्टि के आधार पर बदलती है, इसलिए मैं सभी अलग-अलग प्रकारों को संभालने के लिए कई बार फ़ीड को विभाजित करने और उन्हें एक साथ विलय/क्रमबद्ध करने के लिए समाप्त होता हूं। एक असली दर्द, लेकिन यह काम करता है। –

संबंधित मुद्दे