2014-09-30 1 views
0

Я новичок в программировании и создании программы в VB.Net. эта программа должна читать таблицу данных от http://www.xe.com/currencytables/?from=AUD&date=2014-09-18 и сохранять таблицу в текстовом файле. Я занимаюсь исследованиями в Интернете, но не могу ответить. Было бы очень приятно, если кто-то может мне помочь. Ниже то, что у меня есть до сих порVB.Net сохранить таблицы html на веб-сайте в текстовый файл

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click 

    Dim document As New HtmlAgilityPack.HtmlDocument 
    Dim myHttpWebRequest = CType(WebRequest.Create("http://www.xe.com/currencytables/?from=AUD&date=2014-09-18"), HttpWebRequest) 

    myHttpWebRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" 
    Dim streamRead = New StreamReader(CType(myHttpWebRequest.GetResponse(), HttpWebResponse).GetResponseStream) 
    Dim res As HttpWebResponse = myHttpWebRequest.GetResponse() 
    document.Load(res.GetResponseStream, True) 

    Dim tabletag2 As HtmlNode = document.DocumentNode.SelectSingleNode("//div[@class='ICTtableDiv']//tbody") 
    If tabletag2 IsNot Nothing Then 
     My.Computer.FileSystem.WriteAllText("C:\temp\test.txt", tabletag2.InnerHtml, False) 
    Else 
     MsgBox(Nothing) 
    End If 
    Debug.WriteLine("finished") 
End Sub 

Это сохраняет текстовый файл, но данные в текстовом файле HTML-код таблицы. Мне нужен только текст таблицы. может ли кто-нибудь помочь?

таблица Html в вышеуказанной ссылке выглядит следующим

<div class="ICTtableDiv"> 
         <table id='historicalRateTbl' class='tablesorter ICTTable'> 
          <thead> 
           <tr> 
            <th class="ICTCurrencyCode"> 
             Currency code 
             <span class="nonSortAppend">&#9650;&#9660;</span> 
            </th> 
            <th class="ICTCurrencyName"> 
             Currency name 
             <span class="nonSortAppend">&#9650;&#9660;</span> 
            </th> 
            <th class="ICTRateHeader">Units per AUD</th> 
            <th class="ICTRateHeader">AUD per Unit</th> 
           </tr> 
          </thead> 
          <tbody> 
         <tr><td><a href='/currency/usd-us-dollar'>USD</a></td><td>US Dollar</td><td class="ICTRate">0.8982463498</td><td class="ICTRate">1.1132803381</td></tr><!-- <tr><td><a href='/currency/usd-us-dollar'>USD</a></td><td>US Dollar</td><td class="ICTRate">1.5525826958</td><td class="ICTRate">0.6440880751</td></tr> --><tr><td><a href='/currency/eur-euro'>EUR</a></td><td>Euro</td><td class="ICTRate">0.6955704202</td><td class="ICTRate">1.4376689563</td></tr><!-- <tr><td><a href='/currency/eur-euro'>EUR</a></td><td>Euro</td><td class="ICTRate">1.2973942472</td><td class="ICTRate">0.7707757316</td></tr> --><tr><td><a href='/currency/gbp-british-pound'>GBP</a></td><td>British Pound</td><td class="ICTRate">0.5485743518</td><td class="ICTRate">1.8229069527</td></tr><!-- <tr><td><a href='/currency/gbp-british-pound'>GBP</a></td><td>British Pound</td><td class="ICTRate">0.6505821652</td><td class="ICTRate">1.5370848656</td></tr> --><tr><td><a href='/currency/inr-indian-rupee'>INR</a></td><td>Indian Rupee</td><td class="ICTRate">54.5819382185</td><td class="ICTRate">0.790</td></tr> 

Что я хочу

USD Доллар США 0,8982463498 1,1132803381

для каждой записи в таблице ,

+2

Что такое _table-text_? Предоставьте образец-html и желаемый результат. –

+1

Это может помочь: http://stackoverflow.com/questions/655603/html-agility-pack-parsing-tables –

+0

Если вы собираетесь использовать данные коммерчески, вы должны получить лицензию на их [службу передачи данных] (http://www.xe.com/datafeed/), что позволяет также получать данные в форматах CSV и XML. –

ответ

1

Следующий подход работает с веб-сайтом и желаемым таблетом. Он записывает в файл все выделенные строки, где каждое поле разделяется запятой (при необходимости измените String.Join("," ...)).

Это гибрид петель и LINQ, которые я найти более удобным для чтения (в VB.NET):

Dim table = document.DocumentNode.SelectSingleNode("//table[@class='tablesorter ICTTable']") 
Dim allCSVLines As New List(Of String) 
If table IsNot Nothing Then 
    Dim rows = table.SelectNodes("tr") 
    If rows Is Nothing AndAlso table.SelectSingleNode("tbody") IsNot Nothing Then 
     rows = table.SelectSingleNode("tbody").SelectNodes("tr") 
    End If 
    For Each row As HtmlNode In rows 
     Dim fields = From td In row.SelectNodes("th|td").Cast(Of HtmlNode)() 
        Select td.InnerText 
     Dim csvLine = String.Join(",", fields) 
     allCSVLines.Add(csvLine) 
    Next 
    File.WriteAllLines("C:\temp\test.txt", allCSVLines) 
End If 

Результат (сокращен из-за 166 строк в общей сложности):

USD,US Dollar,0.8982463498,1.1132803381 
EUR,Euro,0.6955704202,1.4376689563 
GBP,British Pound,0.5485743518,1.8229069527 
INR,Indian Rupee,54.5819382185,0.790 
AUD,Australian Dollar,1.0000000000,1.0000000000 
CAD,Canadian Dollar,0.9832756941,1.0170087657 
SGD,Singapore Dollar,1.1388903049,0.8780476888 
CHF,Swiss Franc,0.8394278948,1.1912875498 
MYR,Malaysian Ringgit,2.9181565764,0.3426820919 
JPY,Japanese Yen,97.6309788591,0.0102426506 
CNY,Chinese Yuan Renminbi,5.5165706143,0.1812720384 
NZD,New Zealand Dollar,1.1033232455,0.9063526977 
.... 

Поскольку у вас есть проблемы с получением желаемого результата, это код, который я использовал для загрузки документа. Это тот же самый код, который вы разместили выше. Поэтому непонятно, почему он не подходит для вас:

Dim document As New HtmlAgilityPack.HtmlDocument 
Dim myHttpWebRequest = CType(WebRequest.Create("http://www.xe.com/currencytables/?from=AUD&date=2014-09-18"), HttpWebRequest) 
myHttpWebRequest.UserAgent = "Mozilla/5.0 (compat ble; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" 
Dim streamRead = New StreamReader(CType(myHttpWebRequest.GetResponse(), HttpWebResponse).GetResponseStream) 
Dim res As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse) 
document.Load(res.GetResponseStream, True) 
+0

Привет, Тим, ваше решение выглядит потрясающе. Я попробовал оба решения и получил ошибку в следующей строке Dim tables = From table В документе.DocumentNode.SelectNodes ("// table"). Cast (Of HtmlNode)() Ошибка говорит: «Значения не могут быть нулевыми» –

+0

@fahadkhan: Дайте мне минуту. Я отредактирую вопрос, чтобы он работал с веб-сайтом и нужной таблицей (их несколько). –

+0

Привет, Тим, большое спасибо за ваш ответ. Я пробовал новый код, но не создавал файл по желаемому пути. Я что-то упускаю? –

Смежные вопросы