为什么Beautiful Soup会截断此页面?

时间:2009-03-21 02:08:31

标签: python screen-scraping beautifulsoup

我正在尝试从我的学校图书馆订阅的资源列表中提取资源/数据库名称和ID列表。有些页面列出了不同的资源,我可以使用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 个答案:

答案 0 :(得分:3)

你可以用html5lib而不是内置的解析器尝试美味的汤。

BeautifulSoup(markup, "html5lib")

html5lib更宽松,通常会解析内置解析器截断的页面。请参阅http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree

上的文档

答案 1 :(得分:2)

我使用的是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 :(得分:2)

我强烈建议使用html5lib + lxml而不是美味的汤。它使用真正的HTML解析器(非常类似于Firefox中的解析器),lxml提供了一种非常灵活的方式来查询生成的树(css-selectors或xpath)。

BeautifulSoup中存在大量的错误或奇怪行为,这使得它不是您无法信任的大量HTML标记的最佳解决方案。

答案 3 :(得分:0)

如果我没记错的话,BeautifulSoup在其树中使用“name”作为标签的名称。在这种情况下,“a”将是锚标记的“名称”。

这似乎不应该破坏它。您使用的是什么版本的Python和BS?