我正在尝试从我的学校图书馆订阅的资源列表中提取资源/数据库名称和ID列表。有些页面列出了不同的资源,我可以使用urllib2来获取页面,但是当我将页面传递给BeautifulSoup时,它会在列表中第一个资源的条目结尾之前截断它的树。问题似乎是用于将资源添加到搜索集的图像链接。这就是事情被切断的地方,这是HTML:
<a href="http://www2.lib.myschool.edu:7017/V/ACDYFUAMVRFJRN4PV8CIL7RUPC9QXMQT8SFV2DVDSBA5GBJCTT-45899?func=find-db-add-res&resource=XYZ00618&z122_key=000000000&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的新手,但似乎正好理解它。
感谢您的帮助!
答案 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?