2010-04-02 16 views
11

Próbuję użyć YQL, aby wyodrębnić część HTML z serii stron internetowych. Same strony mają nieco inną strukturę (więc "Strona pobierania" Pipesa Yahoo z funkcją "Wytnij zawartość" nie działa dobrze), ale fragment, który mnie interesuje, zawsze ma ten sam atrybut class.Czy istnieje sposób na zwrócenie HTML przez YQL?

Jeśli mam stronę HTML tak:

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

i użycie wyrażenia YQL takiego:

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

co wrócę to (podobno nieuporządkowane?) Elementy DOM, gdzie czego chcę, to sama treść HTML. Próbowałem także SELECT content, ale to tylko wybiera treść tekstową. Chcę HTML. czy to możliwe?

Odpowiedz

8

Można napisać trochę Open Data Table wysłać normalne YQL html zapytanie stołowego i stringify wynik. Coś jak następuje:

<?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> 

Można następnie kwerendy przeciwko tej niestandardowej tabeli z kwerendy YQL jak:

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' 

Edit: sobie sprawę, że jest to dość stary pytanie, które się zderzyło; przynajmniej odpowiedź jest tutaj, w końcu, dla każdego potykającego się o to pytanie. :)

+0

Piękne! Dziękuję Ci. Jedyny problem, jaki mam teraz, to jak uzyskać zmienną Yahoo Pipes w wyrażeniu YQL. Na przykład, select * from html.tostring gdzie url = item.link i XPath = '// div [@ id = "foo"]' oddaje się błąd „Nieprawidłowy identfier item.link. Mnie jest jedyny obsługiwany identyfikator w tym kontekście. " Jakieś pomysły, jak to robię? (Przepraszamy za zaczęli spożywać fragmencie kodu, wygląda komentarze nie pozwalają znacznie w sposobie formatowania) –

+0

zorientowali się odpowiedź na to: tworzenie oddzielnej rury, która pobiera dane wejściowe URL, który wstawia się w konstruktora ciąg która buduje zapytanie YQL i dołącz to jako zapytanie do widżetu YQL. Następnie w głównej rurze użyj tej nowej rury i podaj adres URL jako dane wejściowe. Myślę, że prawdopodobnie otworzę nowe pytanie w tej sprawie, aby ludzie nie musieli tego szukać w komentarzach do tego. –

+0

otworzony http://stackoverflow.com/questions/2889406/how-do-i-pass-a-yahoo-pipes-item-into-a-yql-query –

0

YQL konwertuje stronę na XML, następnie robi XPath na niej, następnie pobiera DOMNodeList i serializuje ją z powrotem do XML dla twojego wyjścia (a następnie konwertuje do JSON jeśli to konieczne). Nie możesz uzyskać dostępu do oryginalnych danych.

Dlaczego nie radzisz sobie z XML zamiast HTML?

+0

Używam tego w kontekście Yahoo Pipes, więc chcę wstawić kod HTML do kanału RSS, aby był renderowany przez czytnik/przeglądarkę kanałów. Wstawienie XML może działać, ale moduł Pipes YQL wydaje się wstawiać elementy DOM do dokumentu; Nie widzę sposobu na uzyskanie źródła XML. –

2

Miałem ten sam dokładny problem. Jedynym sposobem, w jaki to zrobiłem jest uniknięcie YQL i użycie wyrażeń regularnych do dopasowania znaczników początkowych i końcowych: /. Nie jest to najlepsze rozwiązanie, ale jeśli html jest względnie niezmienny, a wzorzec po prostu od powiedzmy: <div class='name'> do <div class='just_after> ", możesz sobie z tym poradzić. Wtedy możesz uzyskać html pomiędzy.

+0

Tak, właśnie to zrobiłem. Niestety struktura strony zmienia się w zależności od rodzaju wpisu, dlatego muszę kilka razy rozdzielać kanał, aby obsłużyć wszystkie typy i połączyć/posortować je ponownie. Prawdziwy ból, ale działa. –

Powiązane problemy