Почему Beautiful Soup усекает эту страницу? - PullRequest
2 голосов
/ 21 марта 2009

Я пытаюсь получить список имен и идентификаторов ресурсов / баз данных из списка ресурсов, на которые подписана моя школьная библиотека. Есть страницы со списком различных ресурсов, и я могу использовать urllib2 для получения страниц, но когда я передаю страницу в BeautifulSoup, она усекает свое дерево непосредственно перед концом записи для первого ресурса в списке. Кажется, проблема в ссылке на изображение, которая используется для добавления ресурса в поисковый набор. Вот где что-то отрезано, вот HTML:

<a href="http://www2.lib.myschool.edu:7017/V/ACDYFUAMVRFJRN4PV8CIL7RUPC9QXMQT8SFV2DVDSBA5GBJCTT-45899?func=find-db-add-res&amp;resource=XYZ00618&amp;z122_key=000000000&amp;function-in=www_v_find_db_0" onclick='javascript:addToz122("XYZ00618","000000000","myImageXYZ00618","http://discover.lib.myschool.edu:8331/V/ACDYFUAMVRFJRN4PV8CIL7RUPC9QXMQT8SFV2DVDSBA5GBJCTT-45900");return false;'>
    <img name="myImageXYZ00618" id="myImageXYZ00618" src="http://www2.lib.myschool.edu:7017/INS01/icon_eng/v-add_favorite.png" title="Add to My Sets" alt="Add to My Sets" border="0">
</a>

А вот мой код Python:

import urllib2
from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("http://discover.lib.myschool.edu:8331/V?func=find-db-1-title&mode=titles&scan_start=latp&scan_utf=D&azlist=Y&restricted=all")
print BeautifulSoup(page).prettify

В версии BeautifulSoup открывается <a href...>, но <img> нет, а <a> немедленно закрывается, как и остальные открытые теги, вплоть до </html>.

Единственная отличительная черта, которую я вижу для этих изображений «добавить в наборы», заключается в том, что они являются единственными, которые имеют атрибуты name и id. Я не понимаю, почему это привело бы к тому, что BeautifulSoup немедленно прекратил синтаксический анализ.

Примечание: я почти совсем новичок в Python, но, похоже, все хорошо понимаю.

Спасибо за вашу помощь!

Ответы [ 4 ]

3 голосов
/ 03 ноября 2013

Вы можете попробовать красивый суп с html5lib, а не со встроенным парсером.

BeautifulSoup(markup, "html5lib")

html5lib более мягок и часто анализирует страницы, которые обрезает встроенный анализатор. Смотрите документы на http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree

2 голосов
/ 21 марта 2009

Я использовал Firefox «источник выбора вида», который, по-видимому, очищает HTML для меня. Когда я просмотрел исходный код, это то, что я увидел

<img name="myImageXYZ00618" id="myImageXYZ00618" src='http://www2.lib.myschool.edu:7017/INS01/icon_eng/v-add_favorite.png' alt='Add to My Sets' title='Add to My Sets' border="0"title="Add to clipboard PAIS International (CSA)" alt="Add to clipboard PAIS International (CSA)">

Поставив пробел после атрибута border="0", я могу заставить BS проанализировать страницу.

2 голосов
/ 23 марта 2009

Я настоятельно рекомендую использовать html5lib + lxml вместо красивого супа. Он использует настоящий анализатор HTML (очень похожий на тот, что в Firefox), а lxml предоставляет очень гибкий способ запроса результирующего дерева (css-селекторы или xpath).

В BeautifulSoup существует множество ошибок или странного поведения, что делает его не лучшим решением для большой разметки HTML, которой вы не можете доверять.

0 голосов
/ 21 марта 2009

Если я правильно помню, BeautifulSoup использует «имя» в своем дереве в качестве имени тега. В этом случае «a» будет «именем» тега привязки.

Это не похоже, что это должно сломать это все же. Какую версию Python и BS вы используете?

...