2

我正在尝试从我的学校图书馆订阅的资源列表中提取资源/数据库名称和 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

4 回答 4

3

您可以尝试使用 html5lib 而不是内置解析器的漂亮汤。

BeautifulSoup(markup, "html5lib")

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

于 2013-11-03T04:09:12.610 回答
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 解析页面。

于 2009-03-21T06:34:15.967 回答
2

我强烈推荐使用 html5lib + lxml 而不是美汤。它使用真正的 HTML 解析器(与 Firefox 中的解析器非常相似),lxml 提供了一种非常灵活的方式来查询结果树(css-selectors 或 xpath)。

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

于 2009-03-23T19:19:48.760 回答
0

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

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

于 2009-03-21T03:59:26.617 回答