2014-03-27 66 views
0

我使用BeautifulSoup解析页面的HTML。由于HTML损坏,标记不一致。我有以下的html:在html中检测图片标签

<div id='VideoID'> 
<a href=#><img src='file.png'></a> 
</div> 

而其他页面上它的分解为:

<div id='VideoID'> 
    <a href=#></a> [Image Tag not enclosed here] 
    <img src='file.png'> 
    </div> 

以下行按预期工作的第一个片段:

imageURL = imageElement.contents[1].contents[0]['src'].strip() 

但不是第二个其中之一很明显。

无论如何,我在id'VideoID'的DIV中检测到IMAGE标记,无论它是否被封闭在锚标记中或不在其中。

回答

2

是的与.descendants
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#descendants
您可以通过后裔列表迭代,你检查.name
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#name

甚至更​​易于使用CSS选择器:

soup.select("div#VideoID img") 

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

+0

有趣。选择器的工作! – Volatil3

+0

是的,CSS选择器变得非常强大 - 遍历DOM树对它们非常直观。一步一步地循环和做事情,而不是一条清晰的线路解决问题。 – ElmoVanKielmo

1

可以使用recursiveChildGenerator()生成第N子元素并可以找到图像标签。

例如:

for child in childs.recursiveChildGenerator(): 
    image_file = child.findChildren("img") 

这将帮助你找到任何等级的图像标签。

+0

正如你可以看到http://www.crummy.com/software/BeautifulSoup/bs4/doc/#generators在我的答案中'.descendants'是由'.recursiveChildGenerator()'构成的属性。那有什么区别? – ElmoVanKielmo