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