ซุปตาร์สวย - การแก้ปัญหา
การจัดการข้อผิดพลาด
มีข้อผิดพลาดสองประเภทหลักที่ต้องจัดการใน 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 ส่งคืนรายการองค์ประกอบหลาม
สิ่งที่คุณต้องทำคือทำซ้ำผ่านรายการและรับข้อมูลจากองค์ประกอบเหล่านั้น