2016-04-10 14 views
3

WebページをダウンロードしてSQL Server 2012でアクセス可能な形式で保存しようとしています。私は動的SQLを使用していましたが、もっとクリーンで簡単な方法がありますこれを行う。私は正常に私のローカルドライブに下のコードを使用してhtmファイルをダウンロードすることができましたが、私はhtml自体で作業するのが難しいです。私はXMLにWebページを変換しようとしているとそこから解析するが、私は適切にXML変換にHTMLを扱っていないと思う。WebページをダウンロードしてSQLで解析する方法

私は、「許可されていない内部サブセットのDTDとXMLを解析。限られた内部サブセットDTDのサポートを有効にするために、スタイルオプション2でCONVERT使用する」、次のエラーを取得する

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 

残念ながら、これは範囲内で実行する必要があります私の理解は、HTMLアジリティパックはすぐには互換性がないということです。中間のテーブルXMLimportTestには決してデータが格納されないので、不正なHTMLの機能ではない可能性があります。

+1

HTMLは必ずしもXMLに変換できません。クローズされていない
タグや、解析できない< or >を含むスクリプトなどが含まれている可能性があります。そのため、私はHTML AgilityPackのようなライブラリをスクレイプすることを使用しています。さらに、いくつかのウェブページはHTML構文エラーを有する。閉じられていないdivタグまたはpタグ – derloopkat

+0

[SQL Server:XPATHクエリに失敗しました]の重複している可能性があります(http://stackoverflow.com/questions/15981636/sql-server-xpath-query-failing) – derloopkat

+0

使用しているコードはOKと思われます。クリーンなXHTMLであなた自身のWebサイトを作ったのですが、それをXMLにキャストし、その妥当性に頼っているかもしれません。しかし、それ以外の場合はできません。ファイルを 'NVARCHAR(MAX)'型のカラムに最初にインポートしてみてください。あなたがそれをキャストすることができるなら( 'CONVERT(XML、YourData、2)'を試してください)、満足してください!そうでなければ、データを解析する必要があります( 'SUBSTRING'、' PATINDEX'、 'CHARINDEX' ...) – Shnugo

答えて

0

短い回答:しないでください。

SQLはいくつかの点で非常に優れていますが、HTMLをダウンロードして解析するのはひどい選択です。あなたの例では、PowerShellを使ってファイルをダウンロードしていますが、PowerShellのHTMLも解析してみませんか?次に、解析されたデータをCSVファイルのようなものに書き込んで、OPENROWSETを使用して読み込みます。

SQLをまだ使用していないが、SQL Server内でもう少し多くのオプションを使用すると、SQL CLRで.Net SPを使用することができます。

HTMLが整形式XMLであることを保証できれば、SQL XML機能を使用して解析することができますが、Webページはあまり整形式XMLであることはほとんどないので、これは危険な選択です。

関連する問題