2016-04-10 3 views
3

Ich versuche einfach, eine Webseite herunterzuladen und in einem zugänglichen Format in SQL Server 2012 zu speichern. Ich habe auf dynamisches SQL zurückgegriffen, aber vielleicht gibt es einen saubereren, einfacheren Weg mach das. Ich bin in der Lage gewesen, die htm Akten auf mein lokales Laufwerk unter Verwendung des folgenden Codes erfolgreich herunterzuladen, aber ich habe Schwierigkeiten, mit dem HTML selbst zu arbeiten. Ich versuche, die Webseite in XML zu konvertieren und von dort zu analysieren, aber ich denke, dass ich die Konvertierung von HTML zu XML nicht richtig anspreche.Wie Sie eine Webseite herunterladen und in SQL analysieren

bekomme ich folgende Fehler: „XML-Parsing mit interner Teilmenge DTDs nicht erlaubt. Verwenden Sie CONVERT mit Stil Option 2 begrenzte interne Teilmenge DTD-Unterstützung aktivieren“

DECLARE @URL  NVARCHAR(500); 
DECLARE @Ticker NVARCHAR(10) 
DECLARE @DynamicTickerNumber INT 
SET @DynamicTickerNumber = 1 

CREATE TABLE Parsed_HTML(
[Date] DATETIME 
,[Ticker] VarChar (8) 
,[NodeName] VarChar (50) 
,[Value] NVARCHAR (50)); 

WHILE @DynamicTickerNumber <= 2 
BEGIN 

SET @Ticker = (SELECT [Ticker] FROM [Unique Tickers Yahoo] WHERE [Unique Tickers Yahoo].[Ticker Number]= @DynamicTickerNumber) 

SET @URL ='http://finance.yahoo.com/q/ks?s=' + @Ticker + '+Key+Statistics' 

DECLARE @cmd  NVARCHAR(250); 
DECLARE @tOutput TABLE(data NVARCHAR(100)); 
DECLARE @file  NVARCHAR(MAX); 

SET @file='D:\Ressources\Execution Model\Execution Model for SQL\DB Temp\quoteYahooHTML.htm' 
SET @cmd ='powershell "(new-object System.Net.WebClient).DownloadFile('''[email protected]+''','''[email protected]+''')"' 

EXEC master.dbo.xp_cmdshell @cmd, no_output 

CREATE TABLE XmlImportTest 
(
xmlFileName VARCHAR(300), 
xml_data xml 
); 

DECLARE @xmlFileName VARCHAR(300) 
SELECT @xmlFileName = 'D:\Ressources\Execution Model\Execution Model for SQL\DB Temp\quoteYahooHTML.htm' 


EXEC(' 
INSERT INTO XmlImportTest(xmlFileName, xml_data) 

SELECT ''' + @xmlFileName + ''', xmlData 
FROM 
(
SELECT * 
FROM OPENROWSET (BULK ''' + @xmlFileName + ''' , SINGLE_BLOB) AS XMLDATA 
) AS FileImport (XMLDATA) 
') 

DECLARE @x XML; 
DECLARE @string VARCHAR(MAX); 
SET @x = (SELECT xml_data FROM XmlImportTest) 
SET @string = CONVERT(VARCHAR(MAX), @x, 1); 

INSERT INTO [Parsed_HTML] ([NodeName], [Value]) 
SELECT [NodeName], [Value] FROM dbo.XMLTable(@string) 
--above references XMLTable Parsing function that works consistently 

END 

Leider dies innerhalb der Grenzen ausgeführt werden muss von SQL Server, und ich verstehe, dass das HTML Agility Pack nicht sofort kompatibel ist. Ich bemerke auch, dass die Zwischentabelle XMLimportTest niemals gefüllt wird, also ist dies wahrscheinlich keine Funktion von fehlerhaftem HTML.

+1

HTML kann nicht immer in XML konvertiert werden. Es könnte Dinge wie ein nicht geschlossenes
-Tag oder ein Skript enthalten, das < or > enthält, das nicht geparst werden kann. Deshalb verwende ich Scraping-Bibliotheken wie HTML AgilityPack. Außerdem haben einige Webseiten HTML-Syntaxfehler, z. ein nicht geschlossenes div- oder p-Tag. – derloopkat

+0

Mögliches Duplikat von [SQL Server: XPATH-Abfrage fehlgeschlagen] (http://stackoverflow.com/questions/15981636/sql-server-xpath-query-failing) – derloopkat

+0

Der Code, den Sie verwenden, scheint in Ordnung zu sein ... Wenn dies der Fall ist Ist Ihre eigene Website in sauberem XHTML ausgeführt, können Sie sie in XML umwandeln und sich auf deren Gültigkeit verlassen. Aber in jedem anderen Fall können Sie nicht. Versuchen Sie, die Datei zuerst in eine Spalte des Typs NVARCHAR (MAX) zu importieren. Wenn es dir erlaubt, es zu werfen (versuche 'CONVERT (XML, YourData, 2)'), sei glücklich! Wenn nicht, müssen Sie Ihre Daten parsen ('SUBSTRING',' PATINDEX', 'CHARINDEX' ...) – Shnugo

Antwort

0

Kurze Antwort: nicht.

SQL ist sehr gut für einige Dinge, aber zum Herunterladen und Parsen von HTML ist es eine schreckliche Wahl. In Ihrem Beispiel verwenden Sie PowerShell zum Herunterladen der Datei, warum analysieren Sie nicht auch den HTML-Code in der PowerShell? Dann könnten Sie die analysierten Daten in eine CSV-Datei schreiben und diese mit OPENROWSET laden.

Eine weitere Option, die immer noch nicht SQL, aber ein wenig mehr innerhalb von SQL Server verwendet, könnte die Verwendung eines .Net SP über SQL CLR sein.

Wie einige der Kommentare zeigen, wenn Sie garantieren könnten, dass der HTML-Code wohlgeformtes XML war, dann könnten Sie SQL XML-Funktionalität verwenden, um Webseiten zu parsen, aber Webseiten sind selten wohlgeformtes XML, also wäre dies eine riskante Wahl.