ซุปตาร์สวย - การแก้ปัญหา

การจัดการข้อผิดพลาด

มีข้อผิดพลาดสองประเภทหลักที่ต้องจัดการใน BeautifulSoup ข้อผิดพลาดทั้งสองนี้ไม่ได้มาจากสคริปต์ของคุณ แต่มาจากโครงสร้างของข้อมูลโค้ดเนื่องจาก BeautifulSoup API ทำให้เกิดข้อผิดพลาด

ข้อผิดพลาดหลักสองประการมีดังนี้ -

AttributeError

เกิดขึ้นเมื่อสัญกรณ์จุดไม่พบแท็กพี่น้องกับแท็ก HTML ปัจจุบัน ตัวอย่างเช่นคุณอาจพบข้อผิดพลาดนี้เนื่องจากไม่มี "แท็กจุดยึด" คีย์ต้นทุนจะทำให้เกิดข้อผิดพลาดเมื่อข้ามผ่านและต้องใช้แท็กจุดยึด

KeyError

ข้อผิดพลาดนี้เกิดขึ้นหากไม่มีแอตทริบิวต์แท็ก HTML ที่ต้องการ ตัวอย่างเช่นหากเราไม่มีแอตทริบิวต์ data-pid ในข้อมูลโค้ดคีย์ pid จะทำให้คีย์ผิดพลาด

เพื่อหลีกเลี่ยงข้อผิดพลาดสองรายการข้างต้นเมื่อแยกวิเคราะห์ผลลัพธ์ผลลัพธ์นั้นจะถูกข้ามไปเพื่อให้แน่ใจว่าไม่ได้แทรกตัวอย่างข้อมูลที่ผิดรูปแบบลงในฐานข้อมูล -

except(AttributeError, KeyError) as er:
pass

วินิจฉัย()

เมื่อใดก็ตามที่เราพบปัญหาในการทำความเข้าใจว่า BeautifulSoup ทำอะไรกับเอกสารหรือ HTML ของเราเพียงแค่ส่งต่อไปยังฟังก์ชันการวินิจฉัย () ในการส่งไฟล์เอกสารไปยังฟังก์ชันการวินิจฉัย () เราสามารถแสดงได้ว่ารายการตัวแยกวิเคราะห์ต่างๆจัดการกับเอกสารอย่างไร

ด้านล่างนี้เป็นตัวอย่างหนึ่งที่แสดงให้เห็นถึงการใช้งานฟังก์ชั่นวินิจฉัย () -

from bs4.diagnose import diagnose

with open("20 Books.html",encoding="utf8") as fp:
   data = fp.read()
   
diagnose(data)

เอาต์พุต

ข้อผิดพลาดในการแยกวิเคราะห์

ข้อผิดพลาดในการแยกวิเคราะห์มีสองประเภทหลัก ๆ คุณอาจได้รับข้อยกเว้นเช่น HTMLParseError เมื่อคุณฟีดเอกสารของคุณไปยัง BeautifulSoup คุณอาจได้รับผลลัพธ์ที่ไม่คาดคิดโดยที่แผนผังการแยกวิเคราะห์ BeautifulSoup ดูแตกต่างจากผลลัพธ์ที่คาดหวังจากเอกสารแยกวิเคราะห์มาก

ไม่มีข้อผิดพลาดในการแยกวิเคราะห์เนื่องจาก BeautifulSoup เป็นเพราะตัวแยกวิเคราะห์ภายนอกที่เราใช้ (html5lib, lxml) เนื่องจาก BeautifulSoup ไม่มีรหัสตัวแยกวิเคราะห์ใด ๆ วิธีหนึ่งในการแก้ไขข้อผิดพลาดในการแยกวิเคราะห์ข้างต้นคือการใช้โปรแกรมแยกวิเคราะห์อื่น

from HTMLParser import HTMLParser

try:
   from HTMLParser import HTMLParseError
except ImportError, e:
   # From python 3.5, HTMLParseError is removed. Since it can never be
   # thrown in 3.5, we can just define our own class as a placeholder.
   class HTMLParseError(Exception):
      pass

ตัวแยกวิเคราะห์ HTML ในตัวของ Python ทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ที่พบบ่อยที่สุด 2 ข้อคือ HTMLParser.HTMLParserError: แท็กเริ่มต้นที่ผิดรูปแบบและ HTMLParser HTMLParserError: แท็กปิดท้ายที่ไม่ดีและเพื่อแก้ไขปัญหานี้คือการใช้ตัวแยกวิเคราะห์อื่นเป็นหลัก: lxml หรือ html5lib

ลักษณะการทำงานที่ไม่คาดคิดทั่วไปอีกประเภทหนึ่งคือคุณไม่พบแท็กที่คุณทราบว่าอยู่ในเอกสาร อย่างไรก็ตามเมื่อคุณรัน find_all () จะส่งกลับ [] หรือ find () จะส่งกลับ None

อาจเป็นเพราะบางครั้งตัวแยกวิเคราะห์ HTML ในตัว python ข้ามแท็กที่ไม่เข้าใจ

ข้อผิดพลาดตัวแยกวิเคราะห์ XML

ตามค่าเริ่มต้นแพ็คเกจ BeautifulSoup จะแยกวิเคราะห์เอกสารเป็น HTML อย่างไรก็ตามมันใช้งานง่ายมากและจัดการ XML ที่มีรูปแบบไม่ถูกต้องในลักษณะที่สวยงามมากโดยใช้ beautifulsoup4

ในการแยกวิเคราะห์เอกสารเป็น XML คุณต้องมีตัวแยกวิเคราะห์ lxml และคุณเพียงแค่ส่ง "xml" เป็นอาร์กิวเมนต์ที่สองไปยังตัวสร้าง Beautifulsoup -

soup = BeautifulSoup(markup, "lxml-xml")

หรือ

soup = BeautifulSoup(markup, "xml")

ข้อผิดพลาดในการแยกวิเคราะห์ XML ทั่วไปอย่างหนึ่งคือ -

AttributeError: 'NoneType' object has no attribute 'attrib'

สิ่งนี้อาจเกิดขึ้นในกรณีที่องค์ประกอบบางส่วนหายไปหรือไม่ได้กำหนดไว้ในขณะที่ใช้ฟังก์ชัน find () หรือ findall ()

ข้อผิดพลาดในการแยกวิเคราะห์อื่น ๆ

ด้านล่างนี้เป็นข้อผิดพลาดในการแยกวิเคราะห์อื่น ๆ ที่เราจะพูดถึงในส่วนนี้ -

ปัญหาสิ่งแวดล้อม

นอกเหนือจากข้อผิดพลาดในการแยกวิเคราะห์ที่กล่าวมาข้างต้นคุณอาจพบปัญหาในการแยกวิเคราะห์อื่น ๆ เช่นปัญหาด้านสิ่งแวดล้อมที่สคริปต์ของคุณอาจทำงานในระบบปฏิบัติการหนึ่ง แต่ไม่ใช่ในระบบปฏิบัติการอื่นหรืออาจทำงานในสภาพแวดล้อมเสมือนหนึ่ง แต่ไม่ใช่ในสภาพแวดล้อมเสมือนอื่นหรืออาจไม่ทำงาน นอกสภาพแวดล้อมเสมือนจริง ปัญหาทั้งหมดนี้อาจเป็นเพราะสภาพแวดล้อมทั้งสองมีไลบรารีตัวแยกวิเคราะห์ที่แตกต่างกัน

ขอแนะนำให้ทราบหรือตรวจสอบตัวแยกวิเคราะห์เริ่มต้นของคุณในสภาพแวดล้อมการทำงานปัจจุบันของคุณ คุณสามารถตรวจสอบตัวแยกวิเคราะห์เริ่มต้นปัจจุบันที่พร้อมใช้งานสำหรับสภาพแวดล้อมการทำงานปัจจุบันหรือมิฉะนั้นจะส่งผ่านไลบรารีตัวแยกวิเคราะห์ที่จำเป็นอย่างชัดเจนเป็นอาร์กิวเมนต์ที่สองไปยังตัวสร้าง BeautifulSoup

ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

เนื่องจากแท็ก HTML และแอตทริบิวต์ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ตัวแยกวิเคราะห์ HTML ทั้งสามจึงแปลงแท็กและชื่อแอตทริบิวต์เป็นตัวพิมพ์เล็ก อย่างไรก็ตามหากคุณต้องการเก็บแท็กและแอตทริบิวต์แบบผสมหรือตัวพิมพ์ใหญ่หรือตัวพิมพ์ใหญ่คุณควรแยกวิเคราะห์เอกสารเป็น XML

UnicodeEncodeError

ให้เราดูในส่วนรหัสด้านล่าง -

soup = BeautifulSoup(response, "html.parser")
   print (soup)

เอาต์พุต

UnicodeEncodeError: 'charmap' codec can't encode character '\u011f'

ปัญหาข้างต้นอาจเป็นเพราะสองสถานการณ์หลัก คุณอาจพยายามพิมพ์อักขระ Unicode ที่คอนโซลของคุณไม่ทราบวิธีแสดง ประการที่สองคุณกำลังพยายามเขียนลงไฟล์และคุณส่งผ่านอักขระ Unicode ที่ไม่รองรับการเข้ารหัสเริ่มต้นของคุณ

วิธีหนึ่งในการแก้ไขปัญหาข้างต้นคือการเข้ารหัสข้อความ / อักขระตอบกลับก่อนที่จะทำซุปเพื่อให้ได้ผลลัพธ์ที่ต้องการดังนี้ -

responseTxt = response.text.encode('UTF-8')

KeyError: [attr]

เกิดจากการเข้าถึงแท็ก ['attr'] เมื่อแท็กที่เป็นปัญหาไม่ได้กำหนดแอตทริบิวต์ attr ข้อผิดพลาดที่พบบ่อย ได้แก่ “ KeyError: 'href'” และ“ KeyError: 'class'” ใช้ tag.get ('attr') หากคุณไม่แน่ใจว่าได้กำหนด attr ไว้

for item in soup.fetch('a'):
   try:
      if (item['href'].startswith('/') or "tutorialspoint" in item['href']):
      (...)
   except KeyError:
      pass # or some other fallback action

AttributeError

คุณอาจพบ AttributeError ดังต่อไปนี้ -

AttributeError: 'list' object has no attribute 'find_all'

ข้อผิดพลาดข้างต้นส่วนใหญ่เกิดขึ้นเนื่องจากคุณคาดว่า find_all () ส่งคืนแท็กหรือสตริงเดียว อย่างไรก็ตาม soup.find_all ส่งคืนรายการองค์ประกอบหลาม

สิ่งที่คุณต้องทำคือทำซ้ำผ่านรายการและรับข้อมูลจากองค์ประกอบเหล่านั้น