ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3949|ตอบกลับ: 0

[VB.NET] การดึงข้อมูลจากหน้าเว็บเพจ ด้วยการอ่านค่า HTML Tag

[คัดลอกลิงก์]

308

กระทู้

498

โพสต์

5971

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
5971



โปรเจคนี้จัดว่าเป็นลักษณะพื้นฐานในกระบวนการคิดแก้ปัญหา เพราะแอดมินจะนำเสนอวิธีการใช้คำสั่งง่ายๆ ที่ทุกๆภาษาแทบจะต้องมีอยู่แล้ว โดยไม่พึ่งพาความเก่งหรือเทคโนโลยีใหม่ๆแต่ประการใด สำหรับงานนี้เราต้องใช้ความรู้ทั้งด้านการเขียนโปรแกรม และความรู้ในเรื่องการอ่าน Tag ของเอกสาร HTML แต่
แอดมินจะขอลัดขั้นตอนนี้ไปนะครับ หากใครไม่รู้ก็ต้องไปศึกษาหาข้อมูลเองก็แล้วกันครับพี่น้อง ...

กระบวนการคิด คือ ให้นำเว็บเพจมาแสดงผลใน WebBrowser Control จากนั้นเอาเอกสาร หรือที่เราเรียกกันว่า HTML TAG ของเว็บเพจมาเก็บไว้ใน RichTextBox Control (ซึ่งปกติตัวนี้เราจะต้องซ่อนการมองเห็นของ Users) จากนั้นทำการค้นหาคำ (Instr = In String) ที่ต้องการ แล้วเลือกออกมาตามแพทเทิร์นของผู้จัดทำเว็บเพจ เพื่อทำการแยกแยะข้อมูล (Parser) ตามที่เราต้องการ ... สรุปรวม เราแค่โหลดเอกสาร HTML มาเท่านั้น และตัดข้อความเฉพาะในส่วนที่คาดหมายหรือต้องการ แล้วทำการแยกข้อมูลออกมา ในลักษณะที่เหมือนกับชุดข้อความทั่วๆไป ...

ลักษณะข้อมูลที่นำมาใช้เพื่อทำการแยกแยะ ซึ่งเราควรจะนำมาหลายๆชุดเพื่อทำการเปรียบเทียบหาความเหมือน และความต่าง
  1. หน่อไม้ฝรั่ง(เขียว)
  2. <TD class=Tb_Hprice01 width=40>ม.ค. </TD>
  3. <TD class=Tb_cntHP01_02 width=70 align=center>156.45 </TD>
  4. <TD class=Tb_cntHP01_02 width=70 align=center>240.00 </TD>
  5. <TD class=Tb_cntHP01_02 width=70 align=center>120.00 </TD>

  6. กุ้ยช่ายขาว
  7. <TD class=Tb_Hprice01 width=40>ม.ค. </TD>
  8. <TD class=Tb_cntHP01_02 width=70 align=center>114.84 </TD>
  9. <TD class=Tb_cntHP01_02 width=70 align=center>130.00 </TD>
  10. <TD class=Tb_cntHP01_02 width=70 align=center>100.00 </TD>

  11. ผักกวางตุ้งธรรมดา
  12. <TD class=Tb_Hprice01 width=40>ม.ค. </TD>
  13. <TD class=Tb_cntHP01_02 width=70 align=center>9.92 </TD>
  14. <TD class=Tb_cntHP01_02 width=70 align=center>20.00 </TD>
  15. <TD class=Tb_cntHP01_02 width=70 align=center>2.00 </TD>
คัดลอกไปที่คลิปบอร์ด

โค้ดตัวหลักในการแยกแยะข้อมูลออกจากชุดตัวอักษรธรรมดา ... จะเป็นโปรแกรมย่อย เพราะมันมีรอบการทำงาน 12 เดือนที่ซ้ำๆกัน
  1.     ' / --------------------------------------------------------------------------
  2.     Private Sub ExtractData(ByVal MyMonth As String, ByVal MyYear As Integer, ByVal PlantName As String)
  3.         Dim iStart As Long
  4.         Dim iArr(4) As String
  5.         Dim tmp As String
  6.         If RichTextBox1.Text.Length = 0 Then Return
  7.         '// เริ่มต้นอ่านชุดราคาตัวแรกเป็น ราคาเฉลี่ย ... โดยเริ่มนับจากชื่อแรกของเดือน และนับเผื่อไปอีก 195 ตัว
  8.         iStart = InStr(RichTextBox1.Text, MyMonth)
  9.         tmp = Mid(RichTextBox1.Text, iStart, 195)
  10.         '// จะได้--> "ม.ค. </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>156.45 </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>240.00 </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>120.00 </TD>  <TD"

  11.         tmp = tmp.Replace("<TD class=Tb_cntHP01_02 width=70 align=center>", "")
  12.         '// ให้ตัดคำซ้ำออกไปก็จะเหลือ
  13.         '//--> "ม.ค. </TD>  156.45 </TD>  240.00 </TD>  120.00 </TD>  <TD"
  14.         '// แยกชุดข้อมูลออกจากกันด้วย </td> ทำให้
  15.         iArr = Split(tmp.ToLower, "</td>")
  16.         '// iArr(0) = ชื่อเดือน
  17.         '// iArr(1) = "  156.45 " <-- ราคาเฉลี่ย
  18.         '// iArr(2) = "  240.00 " <-- ราคาสูงสุด
  19.         '// iArr(3) = "  120.00 " <-- ราคาต่ำสุด
  20.         Dim row As String() = New String() {Trim(iArr(0)), MyYear, PlantName, Trim(iArr(1)), Trim(iArr(2)), Trim(iArr(3))}
  21.         dgvData.Rows.Add(row)
  22.     End Sub
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดแบบฉบับเต็ม ...
  1. ' / --------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / Purpose: Read HTML Tag from RichTextBox and get some data into DataGridView.
  8. ' / Microsoft Visual Basic .NET (2010)
  9. ' /
  10. ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------

  13. Public Class frmHtml2DataGrid

  14.     ' / --------------------------------------------------------------------------
  15.     Private Sub btnLook_Click(sender As System.Object, e As System.EventArgs) Handles btnLook.Click
  16.         If Trim(txtWebAddress.Text) = "" Then Return
  17.         WebBrowser1.Navigate(txtWebAddress.Text)
  18.     End Sub

  19.     ' / --------------------------------------------------------------------------
  20.     Private Sub frmHtml2DataGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  21.         '// Sample
  22.         txtWebAddress.Text = "http://www.taladsimummuang.com/dmma/Portals/PriceListItem.aspx?id=010131020"
  23.         '// แสดงผล Web Address บน WebBrowser
  24.         If Trim(txtWebAddress.Text) <> "" Then Call btnLook_Click(sender, e)
  25.         '//
  26.         Call InitializeGrid()
  27.     End Sub

  28.     ' / --------------------------------------------------------------------------
  29.     Private Sub btnRead_Click(sender As System.Object, e As System.EventArgs) Handles btnRead.Click
  30.         '// เคลียร์ค่าใน RichTextBox
  31.         RichTextBox1.Clear()
  32.         '// รับค่าเอกสาร HTML TAG ที่อยู่ใน WebBrowser
  33.         RichTextBox1.Text = WebBrowser1.Document.Body.InnerHtml
  34.         If RichTextBox1.Text.Length = 0 Then Return
  35.         '// อ่าน TAG เข้าสู่ตารางกริด
  36.         Call DataWeb2Grid()

  37.         '// เลื่อนแท็ปไปตัวที่ 3 เพื่อแสดงผลข้อม฿ลในตารางกริด
  38.         TabControl1.SelectedIndex = 2
  39.     End Sub

  40.     ' / --------------------------------------------------------------------------
  41.     Private Sub DataWeb2Grid()
  42.         Dim iStart As Long
  43.         Dim iArr(1) As String
  44.         Dim tmp As String

  45.         '// อ่านชื่อพืชผัก
  46.         iStart = InStr(RichTextBox1.Text, "ชื่อ")
  47.         '// จากตำแหน่งแรก iStart ให้บวกไป 25 หลัก และนับไปอีกทั้งหมด 60 ตัว (เผื่อเอาไว้ กรณีมีชื่อผักยาวๆ)
  48.         tmp = Trim(Mid$(RichTextBox1.Text, iStart + 25, 60))
  49.         '// รูปแบบข้อมูลที่ได้ (ภายใต้เครื่องหมาย Double Quote "")
  50.         ' ">หน่อไม้ฝรั่ง(เขียว)</TD></TR>  <TR>  <TD height=10 colSpan="

  51.         '// แยกชุดข้อมูลออกจากกันด้วย </td> แล้วนำเฉพาะ iArr(0) มาเป็นคำตอบ (จะนับถอยหลังเอาก็ได้ แต่จะยุ่งยากกว่า)
  52.         iArr = Split(tmp.ToLower, "</td>")
  53.         '// iArr(0) = ">หน่อไม้ฝรั่ง(เขียว)"
  54.         '// ให้ Replace เครื่องหมาย > ออกไป (เพราะข้อมูลอื่นที่อ่านตัวแรก)
  55.         Dim PlantName As String = Trim(iArr(0).Replace(">", ""))

  56.         '// เริ่มอ่านปี พ.ศ. โดยการค้นหาคำว่า "ราคาเฉลี่ยรายเดือน ประจำปี"
  57.         '// หากเจอให้ iStart + ความยาวของคำมันเอง + 1
  58.         iStart = InStr(RichTextBox1.Text, "ราคาเฉลี่ยรายเดือน ประจำปี") + Len("ราคาเฉลี่ยรายเดือน ประจำปี") + 1
  59.         Dim MyYear As Integer = Mid(RichTextBox1.Text, iStart, 4)

  60.         '// เช็คว่านำข้อมูลเข้าสู่ตารางกริดหรือยัง
  61.         For i = 0 To dgvData.Rows.Count - 1
  62.             '// ตรวจสอบชื่อพืชผักและปี ที่อยู่ในตารางกริด
  63.             If (PlantName = dgvData.Rows(i).Cells(2).Value.ToString) And _
  64.                 (MyYear = dgvData.Rows(i).Cells(1).Value.ToString) Then Return
  65.         Next
  66.         '// Loop Data each month.
  67.         Dim MyMonth As String() = New String() {("ม.ค."), ("ก.พ."), ("มี.ค."), ("เม.ย."), ("พ.ค."), ("มิ.ย."), ("ก.ค."), ("ส.ค."), ("ก.ย."), ("ต.ค."), ("พ.ย."), ("ธ.ค.")}
  68.         For i = 0 To 11
  69.             '// ชื่อเดือนแบบย่อ, ปี, ชื่อพืชผัก
  70.             Call ExtractData(MyMonth(i), MyYear, PlantName)
  71.         Next
  72.     End Sub

  73.     ' / --------------------------------------------------------------------------
  74.     Private Sub ExtractData(ByVal MyMonth As String, ByVal MyYear As Integer, ByVal PlantName As String)
  75.         Dim iStart As Long
  76.         Dim iArr(4) As String
  77.         Dim tmp As String
  78.         If RichTextBox1.Text.Length = 0 Then Return
  79.         '// เริ่มต้นอ่านชุดราคาตัวแรกเป็น ราคาเฉลี่ย ... โดยเริ่มนับจากชื่อแรกของเดือน และนับเผื่อไปอีก 195 ตัว
  80.         iStart = InStr(RichTextBox1.Text, MyMonth)
  81.         tmp = Mid(RichTextBox1.Text, iStart, 195)
  82.         '// จะได้--> "ม.ค. </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>156.45 </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>240.00 </TD>  <TD class=Tb_cntHP01_02 width=70 align=center>120.00 </TD>  <TD"

  83.         tmp = tmp.Replace("<TD class=Tb_cntHP01_02 width=70 align=center>", "")
  84.         '// ให้ตัดคำซ้ำออกไปก็จะเหลือ
  85.         '//--> "ม.ค. </TD>  156.45 </TD>  240.00 </TD>  120.00 </TD>  <TD"
  86.         '// แยกชุดข้อมูลออกจากกันด้วย </td> ทำให้
  87.         iArr = Split(tmp.ToLower, "</td>")
  88.         '// iArr(0) = ชื่อเดือน
  89.         '// iArr(1) = "  156.45 " <-- ราคาเฉลี่ย
  90.         '// iArr(2) = "  240.00 " <-- ราคาสูงสุด
  91.         '// iArr(3) = "  120.00 " <-- ราคาต่ำสุด
  92.         Dim row As String() = New String() {Trim(iArr(0)), MyYear, PlantName, Trim(iArr(1)), Trim(iArr(2)), Trim(iArr(3))}
  93.         dgvData.Rows.Add(row)
  94.     End Sub

  95.     Private Sub WebBrowser1_DocumentCompleted(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
  96.         Dim UrlString As String = WebBrowser1.Url.AbsoluteUri.ToString()
  97.         '// จะแสดงลิ้งค์ใหม่ใน Web Address ทันทีที่มีลิ้งค์ไปยังหน้า PriceListItem.aspx
  98.         If InStr(UrlString.ToLower, "PriceListItem.aspx".ToLower) > 0 Then
  99.             txtWebAddress.Text = UrlString
  100.         End If
  101.     End Sub

  102.     ' / --------------------------------------------------------------------------------
  103.     '// การตั้งค่าเริ่มต้นให้กับตารางกริดในแบบ @Run Time
  104.     Private Sub InitializeGrid()
  105.         With dgvData
  106.             .RowHeadersVisible = False
  107.             .AllowUserToAddRows = False
  108.             .AllowUserToDeleteRows = False
  109.             .AllowUserToResizeRows = False
  110.             .MultiSelect = False
  111.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  112.             .ReadOnly = True
  113.             .Font = New Font("Tahoma", 9)
  114.             ' จัดความกว้างของแต่ละหลัก
  115.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  116.             .AutoResizeColumns()
  117.             ' Adjust Header Styles
  118.             With .ColumnHeadersDefaultCellStyle
  119.                 .BackColor = Color.Navy
  120.                 .ForeColor = Color.White
  121.                 .Font = New Font("Tahoma", 9, FontStyle.Bold)
  122.             End With
  123.             '// Columns Specified (Count all Columns)
  124.             .ColumnCount = 6
  125.             .Columns(0).Name = "Month"
  126.             .Columns(1).Name = "Year"
  127.             .Columns(2).Name = "PlantName"
  128.             .Columns(3).Name = "Average"
  129.             .Columns(4).Name = "Max"
  130.             .Columns(5).Name = "Min"
  131.             '//
  132.             .Columns("Month").HeaderText = "เดือน"
  133.             .Columns("Year").HeaderText = "ปี พ.ศ."
  134.             .Columns("PlantName").HeaderText = "ผลิตผล"
  135.             .Columns("Average").HeaderText = "ราคาเฉลี่ย"
  136.             .Columns("Max").HeaderText = "ราคาสูงสุด"
  137.             .Columns("Min").HeaderText = "ราคาต่ำสุด"
  138.             '// จัดระเบียบการแสดงผล
  139.             For i = 3 To 5
  140.                 .Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  141.                 .Columns(i).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  142.             Next
  143.         End With
  144.     End Sub

  145.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  146.         Me.Close()
  147.     End Sub

  148.     Private Sub frmHtml2DataGrid_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  149.         Me.Dispose()
  150.         Application.Exit()
  151.     End Sub

  152. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-3-28 15:08 , Processed in 0.193528 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้