Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

จะแยกวิเคราะห์หน้า HTML เพื่อดึงตาราง HTML ด้วย Python ได้อย่างไร


ปัญหา

คุณต้องแยกตาราง HTML ออกจากหน้าเว็บ

แนะนำตัว

อินเทอร์เน็ตและเวิลด์ไวด์เว็บ (WWW) เป็นแหล่งข้อมูลที่โดดเด่นที่สุดในปัจจุบัน มีข้อมูลมากมายอยู่ที่นั่น มันยากมากที่จะเลือกเนื้อหาจากตัวเลือกมากมาย ข้อมูลส่วนใหญ่นั้นสามารถเรียกค้นได้ผ่าน HTTP

แต่เรายังสามารถดำเนินการเหล่านี้โดยทางโปรแกรมเพื่อดึงและประมวลผลข้อมูลโดยอัตโนมัติ

Python ช่วยให้เราทำสิ่งนี้ได้โดยใช้ไลบรารีมาตรฐานของไคลเอ็นต์ HTTP แต่โมดูลคำขอช่วยในการรับข้อมูลหน้าเว็บได้ง่ายมาก

ในบทความนี้ เราจะมาดูวิธีแยกวิเคราะห์หน้า HTML เพื่อแยกตาราง HTML ที่ฝังอยู่ในหน้า

ทำอย่างไร..

1.เราจะใช้คำขอ แพนด้า ซุปที่สวยงาม4 และแพ็คเกจแบบตาราง โปรดติดตั้งลงในระบบของคุณหากขาดหายไป หากคุณไม่แน่ใจ โปรดใช้การตรึง pip เพื่อตรวจสอบ

นำเข้าคำขอนำเข้าแพนด้าเป็นตาราง pdfrom นำเข้าตาราง

2. เราจะใช้ https://www.tutorialspoint.com/python/python_basic_operators.htm เพื่อสรรเสริญผ่านหน้าและพิมพ์หน้า HTML ทั้งหมดที่ฝังอยู่ภายใน

# ตั้งค่าเว็บไซต์ urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm"

3.เราจะทำการร้องขอไปยังเซิร์ฟเวอร์และดูการตอบกลับ

# ส่งคำขอไปยังเซิร์ฟเวอร์response =request.get(site_url)# ตรวจสอบการตอบกลับ (f"*** คำตอบสำหรับ {site_url} คือ {response.status_code}")

4. รหัสตอบกลับ 200 - หมายถึงการตอบกลับจากเซิร์ฟเวอร์สำเร็จ ดังนั้นตอนนี้เราจะตรวจสอบส่วนหัวของคำขอ ส่วนหัวการตอบสนอง และ 100 ข้อความแรกที่เซิร์ฟเวอร์ส่งคืน

# ตรวจสอบส่วนหัวของคำขอ (f"*** กำลังพิมพ์ส่วนหัวคำขอ - \n {response.request.headers} ")# ตรวจสอบส่วนหัวของคำขอ (f"*** การพิมพ์ส่วนหัวคำขอ - \n {การตอบสนอง .headers} ")# ตรวจสอบเนื้อหาของผลลัพธ์การพิมพ์ (f"*** การเข้าถึงอักขระ 100/{len(response.text)} ตัวแรก - \n\n {response.text[:100]} ") 

ผลลัพธ์

*** การพิมพ์ส่วนหัวคำขอ -{'User-Agent':'python-requests/2.24.0', 'Accept-Encoding':'gzip, deflate', 'Accept':'*/*', 'การเชื่อมต่อ':'รักษาชีวิต'}*** การพิมพ์ส่วนหัวของคำขอ -{'การเข้ารหัสเนื้อหา':'gzip', 'ยอมรับช่วง':'ไบต์', 'อายุ':'213246', 'แคช- การควบคุม':'max-age=2592000', 'Content-Type':'text/html; charset=UTF-8', 'Date':'Tue, 20 Oct 2020 09:45:18 GMT', 'Expires':'Thu, 19 Nov 2020 09:45:18 GMT', 'Last-Modified':' ส. 17 ต.ค. 2020 22:31:13 GMT', 'Server':'ECS (meb/A77C)', 'Strict-Transport-Security':'max-age=63072000; includeSubdomains', 'Vary':'Accept-Encoding', 'X-Cache':'HIT', 'X-Content-Type-Options':'nosniff', 'X-Frame-Options':'SAMEORIGIN', ' X-XSS-การป้องกัน':'1; mode=block', 'Content-Length':'8863'}*** การเข้าถึงอักขระ 100/37624 ตัวแรก -Python - Basic โอเปอเรเตอร์ - Tutorialspoint

5. ตอนนี้เราจะใช้ BeautifulSoup เพื่อแยกวิเคราะห์ HTML

# แยกวิเคราะห์หน้า HTML จาก bs4 นำเข้า BeautifulSouptutorialpoints_page =BeautifulSoup(response.text, 'html.parser')print(f"*** ชื่อของหน้าคือ - {tutorialpoints_page.title}")# คุณสามารถแตกไฟล์ ชื่อหน้าเป็นสตริงด้วย wellprint(f"*** ชื่อของหน้าคือ - {tutorialpoints_page.title.string}")

6. ตารางส่วนใหญ่จะมีการกำหนดส่วนหัวในแท็ก h2, h3, h4, h5 หรือ h6 ก่อนอื่นเราระบุแท็กเหล่านี้ จากนั้นเราจะเลือกตาราง html ถัดจากแท็กที่ระบุ สำหรับตรรกะนี้ เราจะใช้ find, brother และ find_next_siblings ตามที่กำหนดไว้ด้านล่าง

# ค้นหาทั้งหมด h3 elementsprint(f"{tutorialpoints_page.find_all('h2')}")tags =tutorialpoints_page.find(lambda elm:elm.name =="h2" หรือ elm.name =="h3" หรือ elm.name =="h4" หรือ elm.name =="h5" หรือ elm.name =="h6") สำหรับ brother ใน tags.find_next_siblings():if brother.name =="table":my_table =brotherdf =pd.read_html(str(my_table))print(tabulate(df[0], headers='keys', tablefmt='psql'))

โค้ดเต็ม

7.รวบรวมทุกอย่างไว้เลย

# STEP1 :ดาวน์โหลดหน้า requiredimport requestimport pandas as pd# set the site urlsite_url ="https://www.tutorialspoint.com/python/python_basic_operators.htm"# Make a request to the serverresponse =routes.get(site_url )# ตรวจสอบการตอบกลับ (f"*** คำตอบสำหรับ {site_url} คือ {response.status_code}")# ตรวจสอบส่วนหัวของคำขอ (f"*** การพิมพ์ส่วนหัวของคำขอ - \n {response.request.headers} ")# ตรวจสอบส่วนหัวของการตอบสนอง (f"*** กำลังพิมพ์ส่วนหัวของคำขอ - \n {response.headers} ")# ตรวจสอบเนื้อหาของผลลัพธ์การพิมพ์ (f"*** กำลังเข้าถึง 100 ตัวแรก/{len(response. text)} อักขระ - \n\n {response.text[:100]} ")# แยกวิเคราะห์หน้า HTML จาก bs4 นำเข้า BeautifulSouptutorialpoints_page =BeautifulSoup(response.text, 'html.parser')print(f"*** ชื่อเรื่อง ของหน้าคือ - {tutorialpoints_page.title}")# คุณสามารถแยกชื่อหน้าเป็นสตริงได้เช่นกัน wellprint(f"*** ชื่อของหน้าคือ - {tutorialpoints_page.title.string}")# ค้นหา h3 ทั้งหมด องค์ประกอบ # พิมพ์ (f"{tuto rialpoints_page.find_all('h2')}")tags =tutorialpoints_page.find(lambda elm:elm.name =="h2" หรือ elm.name =="h3" หรือ elm.name =="h4" หรือ elm.name =="h5" หรือ elm.name =="h6") สำหรับพี่น้องใน tags.find_next_siblings():if sibling.name =="table":my_table =brotherdf =pd.read_html(str(my_table))print )

ผลลัพธ์

*** การตอบกลับสำหรับ https://www.tutorialspoint.com/python/python_basic_operators.htm คือ 200*** การพิมพ์ส่วนหัวของคำขอ -{'User-Agent':'python-requests/2.22.0' , 'Accept-Encoding':'gzip, deflate', 'Accept':'*/*', 'Connection':'keep-alive'}*** การพิมพ์ส่วนหัวของคำขอ -{'Content-Encoding':'gzip 'Accept-Range':'bytes', 'Age':'558841', 'Cache-Control':'max-age=2592000', 'Content-Type':'text/html; charset=UTF-8', 'Date':'Sat, 24 Oct 2020 09:45:13 GMT', 'Expires':'Mon, 23 Nov 2020 09:45:13 GMT', 'Last-Modified':' ส. 17 ต.ค. 2020 22:31:13 GMT', 'Server':'ECS (meb/A77C)', 'Strict-Transport-Security':'max-age=63072000; includeSubdomains', 'Vary':'Accept-Encoding', 'X-Cache':'HIT', 'X-Content-Type-Options':'nosniff', 'X-Frame-Options':'SAMEORIGIN', ' X-XSS-การป้องกัน':'1; mode=block', 'Content-Length':'8863'}*** การเข้าถึงอักขระ 100/37624 ตัวแรก -Python - Basic Operators - Tutorialspoint*** ชื่อของหน้าคือ - Python - Basic Operators - Tutorialspoint*** ชื่อของหน้าคือ - Python - Basic Operators - Tutorialspoint[

ประเภทของตัวดำเนินการ

,

ตัวดำเนินการทางคณิตศาสตร์ของ Python

,

ตัวดำเนินการเปรียบเทียบ Python

,

ตัวดำเนินการการมอบหมาย Python

,

ตัวดำเนินการ Python Bitwise

,

Python Logical Operators

,

Python Membership Operators

,

Python Identity Operators

,

Python Operators Precedence

][ Operator Description \ 0 + การบวก เพิ่มค่าที่ด้านใดด้านหนึ่งของตัวดำเนินการ 1 - การลบ การลบ การลบ ตัวถูกดำเนินการทางขวามือจากมือซ้าย op...2 * การคูณ คูณค่าที่ด้านใดด้านหนึ่งของตัวดำเนินการ 3 / การหาร หารตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวา4 % โมดูลัส หาร ตัวถูกดำเนินการทางซ้าย โดยตัวถูกดำเนินการทางขวา...5 ** เลขชี้กำลังดำเนินการคำนวณแบบเอ็กซ์โพเนนเชียล (กำลัง) บน op...6 // Floor Division - การแบ่งส่วนของตัวถูกดำเนินการที่...

ตัวอย่าง

0 a + b =301 a – b =-102 a * b =2003 b / a =24 b % a =05 a**b =10 ยกกำลัง 206 9//2 =4 และ 9.0// 2.0 =4.0, -11//3 =-4, -11.... ][ Operator Description \0 ==หากค่าของตัวถูกดำเนินการสองตัวเท่ากัน ดังนั้น ...1 !=ถ้าค่าของตัวถูกดำเนินการสองตัวไม่เท่ากัน เท่ากับ แล้ว ...2 <> หากค่าของตัวถูกดำเนินการสองตัวไม่เท่ากัน ดังนั้น ...3> หากค่าของตัวถูกดำเนินการทางซ้ายมากกว่า t...4 <หากค่าของตัวถูกดำเนินการทางซ้ายน้อยกว่า ..5>=หากค่าของตัวถูกดำเนินการทางซ้ายมากกว่า o...6 <=หากค่าของตัวถูกดำเนินการทางซ้ายน้อยกว่าหรือ e...

ตัวอย่าง

0 (a ==b) ไม่เป็นความจริง 1 (a !=b) เป็นจริง 2 (a <> b) เป็นจริง สิ่งนี้คล้ายกับตัวดำเนินการ !=3 (a> b) ไม่จริง 4 (a =b) ไม่จริง 6 (a <=b) เป็นจริง ][ Operator Description \0 =กำหนดค่าจากตัวถูกดำเนินการด้านขวาให้กับ lef...1 +=Add AND มันเพิ่มตัวถูกดำเนินการทางขวาให้กับตัวถูกดำเนินการทางซ้าย และ ...2 -=ลบ และ มันลบตัวถูกดำเนินการทางขวาจากตัวถูกดำเนินการทางซ้าย.. .3 *=คูณ และ มันคูณตัวถูกดำเนินการทางขวาด้วยตัวถูกดำเนินการทางซ้าย...4 /=หาร AND มันหารตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวา...5 %=โมดูลัส และ ใช้โมดูลัสโดยใช้ตัวถูกดำเนินการสองตัวและกำหนด...6 **=เลขชี้กำลัง AND ทำการคำนวณแบบเอ็กซ์โพเนนเชียล (กำลัง) บน op...7 //=การแบ่งชั้น มันดำเนินการแบ่งพื้นบนตัวดำเนินการและเป็น...

ตัวอย่าง

0 c =a + b กำหนดค่าของ a + b เป็น c1 c +=a เทียบเท่ากับ c =c + a2 c -=a เทียบเท่ากับ c =c - a3 c *=a เทียบเท่ากับ c =c * a4 c /=a เท่ากับ c =c / a5 c %=a เทียบเท่ากับ c =c % a6 c **=a เท่ากับ c =c ** a7 c //=a เทียบเท่ากับ c =c // a ][ Operator \0 &Binary AND1 | Binary OR2 ^ Binary XOR3 ~ Binary Ones Complement4 <> Binary Right ShiftDescription \0 Operator คัดลอกบิตไปยังผลลัพธ์หากมีอยู่...1 มันจะคัดลอกบิตหากมีอยู่ในตัวถูกดำเนินการอย่างใดอย่างหนึ่ง2 มันคัดลอก bit ถ้าถูกกำหนดไว้ในตัวถูกดำเนินการตัวเดียว ...3 เป็น unary และมีเอฟเฟกต์ 'พลิก' b...4 ค่าตัวถูกดำเนินการทางซ้ายถูกย้ายไปทางซ้ายโดย n...5 ค่าตัวถูกดำเนินการทางซ้ายจะถูกเลื่อนไปทางขวาโดย ที่ ...

ตัวอย่าง

0 (a &b) (หมายถึง 0000 1100)1 (a | b) =61 (หมายถึง 0011 1101)2 (a ^ b) =49 (หมายถึง 0011 0001)3 (~a ) =-61 (หมายถึง 1100 0011 ในการเสริมของ 2...4 a <<2 =240 (หมายถึง 1111 0000)5 a>> 2 =15 (หมายถึง 0000 1111) ][ Operator Description \0 และ Logical AND หากตัวถูกดำเนินการทั้งสองเป็นจริงเงื่อนไข b ...1 หรือตรรกะ OR หากตัวถูกดำเนินการสองค่าใด ๆ ที่ไม่ใช่ศูนย์ ดังนั้น c...2 ไม่ใช่ตรรกะ ไม่ใช้เพื่อย้อนกลับสถานะทางตรรกะของตัวถูกดำเนินการ ตัวอย่าง0 (a และ b) เป็นจริง 1 (a หรือ b ) เป็นจริง2 ไม่ใช่ (a และ b) เป็นเท็จ ][ Operator Description \0 ใน ประเมินว่าเป็นจริง หากพบตัวแปรใน th...1 ไม่อยู่ใน ประเมินว่าเป็นจริง หากไม่พบตัวแปร... 

ตัวอย่าง

0 x ใน y ให้ผลลัพธ์เป็น 1 ถ้า x เป็น membe...1 x ไม่ใช่ y ในที่นี้จะไม่ให้ผลลัพธ์เป็น 1 ถ้า x คือ... ][ Operator Description \0 is Evaluates to จริง หากตัวแปรใน s...1 ไม่ประเมินเป็นเท็จ หากตัวแปรใน ...

ตัวอย่าง

0 x คือ y ผลลัพธ์ที่ได้คือ 1 ถ้า id(x) เท่ากับ i...1 x ไม่ใช่ y จะไม่ได้ผลลัพธ์เป็น 1 หาก id(x) ... ][ Sr.No. Operator &Description0 1 ** การยกกำลัง (ยกกำลัง)1 2 ~ + - Complement, unary plus และ minus (วิธี...2 3 * / % // คูณ หาร โมดูโล และชั้น di...3 4 + - การบวกและการลบ4 5>> <<ขวาและซ้าย bitwise shift5 6 &Bitwise 'AND'6 7 ^ | Bitwise พิเศษ `OR' และปกติ `OR'7 8 <=<>>=ตัวดำเนินการเปรียบเทียบ 8 9 <> ==! =ตัวดำเนินการความเท่าเทียมกัน 9 10 =%=/=//=-=+=*=**=ตัวดำเนินการการมอบหมาย10 11 ไม่ใช่ตัวดำเนินการข้อมูลประจำตัว11 12 ไม่ได้อยู่ใน]