ค้นหาเว็บไซต์

วันศุกร์แสนสนุก: มันคือ PowerShell นะที่รัก!


ความท้าทายที่ฉันมอบให้ตัวเองคือการรับข้อมูลจากตารางและแปลงเป็นออบเจ็กต์ PowerShell เมื่อคุณเรียกใช้ Invoke-Webrequest จากคอนโซล PowerShell (อย่าใช้ ISE) คุณจะได้รับคุณสมบัติของ ParsedHTML ด้วยคุณสมบัตินี้ คุณสามารถใช้ Microsoft DOM (โมเดลออบเจ็กต์เอกสาร) เพื่อแยกวิเคราะห์ข้อมูลได้ ฉันยอมรับว่าฉันยังเป็นเด็กรุ่นใหม่เมื่อพูดถึงการทำงานกับ DOM แต่ฉันก็ไปถึงจุดนั้นแล้ว อย่างไรก็ตาม...เมื่อดูแหล่งที่มาของหน้า ซึ่งคุณสามารถทำได้ในเบราว์เซอร์ใดก็ได้ ฉันได้เรียนรู้ว่าตารางที่ฉันต้องการนั้นเป็นตารางแรกในหน้าเว็บ เรามาเริ่มรับผลลัพธ์ PowerShell กันดีกว่า

$uri = "http://www.ssa.gov/OACT/babynames/index.html"

#get the data
$data = Invoke-WebRequest $uri

#get the first table
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -first 1

ฉันใช้เมธอด GetElementsByTagName จาก DOM เพื่อดึงข้อมูลตารางทั้งหมด จากนั้นเลือกตารางแรก วัตถุตารางมีคุณสมบัติข้อความบางอย่างที่ฉันสามารถลองแยกวิเคราะห์ได้ แต่ฉันตัดสินใจใช้แนวทางอื่น ตารางมีแถวต่างๆ ซึ่งฉันหาได้

#get the rows
$rows = $table.rows

รายการแรกในคอลเลกชันของแถวจะเป็นส่วนหัวของตาราง ข้อมูลนี้จะกลายเป็นคุณสมบัติของวัตถุของฉัน

#get table headers
$headers = $rows.item(0).children | select -ExpandProperty InnerText

ตอนนี้ $headers เป็นอาร์เรย์ของสตริงจากแต่ละคอลัมน์ของตาราง ตอนนี้เป็นส่วนที่ยุ่งยากและอาจมีหลายวิธีที่คุณจะเข้าถึงสิ่งนี้ได้ ฉันต้องดูแถวที่เหลือในตารางและจับคู่แต่ละคอลัมน์กับส่วนหัว และสุดท้ายก็สร้างออบเจ็กต์แบบกำหนดเอง ฉันตัดสินใจใช้ For enumeration เพื่อดูแต่ละแถว จากนั้นภายในแต่ละแถวแจกแจงอีกครั้งโดยใช้ส่วนหัวและเพิ่มแต่ละรายการลงในตารางแฮช ซึ่งในที่สุดฉันก็สามารถเปลี่ยนเป็นวัตถุที่กำหนดเองได้

#count number of rows
$NumOfRows = $rows | Measure-Object

#enumerate the remaining rows (skipping the header row) and create a custom object
for ($i=1;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}
 #get the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the corresponding
    #table header value
    $objHash.Add($headers[$j],$rowdata[$j])
  } #for

  #turn the hashtable into a custom object
  [pscustomobject]$objHash
} #for

นี่คือผลลัพธ์

เนื่องจากสคริปต์ของฉันกำลังเขียนออบเจ็กต์ลงในไปป์ไลน์ ฉันจึงสามารถทำสิ่งต่างๆ เช่น เรียงลำดับและเลือกได้

ฉันไม่สามารถรับประกันได้ว่ารหัสนี้จะจัดการกับทุกตารางที่คุณเจอ แต่อาจช่วยให้คุณเริ่มต้นได้ และคุณสามารถขอความช่วยเหลือได้ตลอดเวลาในฟอรัมที่ PowerShell.org หากคุณกำลังมองหาตัวอย่างเพิ่มเติมเกี่ยวกับ Invoke-WebRequest คุณสามารถดูที่ Get Beer List และ Browsing Trainsignal Courses

สนุก!

บทความที่เกี่ยวข้อง