سؤال

أحاول تحليل صفحة HTML باستخدام BeautifulSoup ، لكن يبدو أن BeautifulSoup لا يحب HTML أو تلك الصفحة على الإطلاق. عندما أقوم بتشغيل الكود أدناه ، تقوم الطريقة PretTify () بإرجاع كتلة البرنامج النصي فقط في الصفحة (انظر أدناه). هل لدى أي شخص فكرة لماذا يحدث؟

import urllib2
from BeautifulSoup import BeautifulSoup

url = "http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1"
html = "".join(urllib2.urlopen(url).readlines())
print "-- HTML ------------------------------------------"
print html
print "-- BeautifulSoup ---------------------------------"
print BeautifulSoup(html).prettify()

هو المخرجات التي تنتجها جميلة.

-- BeautifulSoup ---------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="JavaScript">
 <!--
     function highlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_on.gif";
     }

     function unhighlight(img) {
       document[img].src = "/marketing/sony/images/en/" + img + "_off.gif";
     }
//-->
</script>

شكرًا!

تحديث: أنا أستخدم الإصدار التالي ، والذي يبدو أنه الأحدث.

__author__ = "Leonard Richardson (leonardr@segfault.org)"
__version__ = "3.1.0.1"
__copyright__ = "Copyright (c) 2004-2009 Leonard Richardson"
__license__ = "New-style BSD"
هل كانت مفيدة؟

المحلول

حاول مع الإصدار 3.0.7a كما asukasz اقترحت. تم تصميم BeautifulSoup 3.1 ليكون متوافقًا مع Python 3.0 ، لذا اضطروا إلى تغيير المحلل من SGMLParser إلى HTMLParser والذي يبدو أكثر عرضة لـ HTML السيئة.

من Changelog for BeautifulSoup 3.1:

"يعتمد الحساء الجميل الآن على htmlparser بدلاً من sgmlparser ، والذي ذهب في Python 3. هناك بعض HTML السيئ الذي تعاملت معه SGMLParser لكن HTMLPARSER لا" لا ".

نصائح أخرى

محاولة LXML. على الرغم من اسمها ، فهي أيضًا لتحليل وتجاهل HTML. إنها أسرع بكثير من BeautifulSoup ، وحتى أنها تتعامل مع "مكسورة" HTML أفضل من BeautifulSoup ، لذلك قد تعمل بشكل أفضل بالنسبة لك. يحتوي على واجهة برمجة تطبيقات التوافق لـ BeautifulSoup أيضًا إذا كنت لا ترغب في تعلم واجهة برمجة تطبيقات LXML.

إيان بليكينغ يوافق.

لا يوجد سبب لاستخدام BeautifulSoup بعد الآن ، إلا إذا كنت على محرك تطبيق Google أو أي شيء لا يُسمح به أي شيء غير محض.

BeautifulSoup ليست سحرية: إذا كانت HTML الواردة فظيعة للغاية ، فلن تعمل.

في هذه الحالة ، فإن HTML الواردة هو بالضبط: مكسور جدًا بالنسبة لـ BeautifulSoup لمعرفة ما يجب القيام به. على سبيل المثال ، يحتوي على ترميز مثل:

نوع البرنامج النصي = "" JavaScript ""

(لاحظ الاقتباس المزدوج.)

يحتوي مستندات BeautifulSoup على قسم ما يمكنك فعله إذا لم تتمكن BeautifulSoup من تحليلك. ستحتاج إلى التحقيق في تلك البدائل.

Samj: إذا حصلت على أشياء مثلHTMLParser.HTMLParseError: bad end tag: u"</scr' + 'ipt>"أنا فقط أزيل الجاني من الترميز قبل أن أخدمه إلى BeautifulSoup وكل شيء هو Dandy:

html = urllib2.urlopen(url).read()
html = html.replace("</scr' + 'ipt>","")
soup = BeautifulSoup(html)

واجهت مشاكل في تحليل الرمز التالي أيضًا:

<script>
        function show_ads() {
          document.write("<div><sc"+"ript type='text/javascript'src='http://pagead2.googlesyndication.com/pagead/show_ads.js'></scr"+"ipt></div>");
        }
</script>

htmlparseerror: علامة نهاية سيئة: u '' ، في السطر 26 ، العمود 127

سام

لقد اختبرت هذا البرنامج النصي على إصدار BeautifulSoup '3.0.7a "وهو يعيد ما يبدو أنه مخرج صحيح. لا أعرف ما الذي تغير بين "3.0.7a" و "3.1.0.1" ولكن جربه.

import urllib
from BeautifulSoup import BeautifulSoup

>>> page = urllib.urlopen('http://www.futureshop.ca/catalog/subclass.asp?catid=10607&mfr=&logon=&langid=FR&sort=0&page=1')
>>> soup = BeautifulSoup(page)
>>> soup.prettify()

في حالتي من خلال تنفيذ العبارات المذكورة أعلاه ، فإنه يعيد صفحة HTML بأكملها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top