这是一个几乎已经解决的小问题in a previous question。
问题是我现在有一些评论,但它并不是我需要的。我得到了一系列评论内容。我需要在中间获取html。
说我有类似的东西:
<p>some html here<p>
<!-- begin mark -->
<p>Html i'm interested at.</p>
<p>More html i want to pull out of the document.</p>
<!-- end mark -->
<!-- begin mark -->
<p>This will be pulled later, but we will come to it when I get to pull the previous section.</p>
<!-- end mark -->
在回复中,他们指向Crummy explanation on navigating the html tree,但我找不到并回答我的问题。
有什么想法吗?感谢。
PS。如果有人指出我在文档中重复几次这个过程的优雅方式,我可能会让它起作用,但很糟糕:D
编辑添加:
根据Martijn Pieters提供的信息,我必须将使用上述代码获得的comments
数组传递给他设计的生成器函数。所以这没有错误:
for elem in comments:
htmlcode = allnext(comments)
print htmlcode
我认为现在可以在迭代数组之前操作htmlcode内容。
答案 0 :(得分:2)
您可以使用.next_sibling
指针转到下一个元素。您可以使用它来查找关注评论的所有内容,但不包括其他评论:
from bs4 import Comment
def allnext(comment):
curr = comment
while True:
curr = curr.next_sibling
if isinstance(curr, Comment):
return
yield curr
这是一个生成器函数,您可以使用它迭代所有“下一个”元素:
for elem in allnext(comment):
print elem
或者您可以使用它来创建所有下一个元素的列表:
elems = list(allnext(comment))
您的示例对于BeautifulSoup来说有点小,它会将每条评论包装在<p>
标记中,但如果我们使用原始目标www.gamespot.com
中的代码段,则效果很好:
<div class="ad_wrap ad_wrap_dart"><div style="text-align:center;"><img alt="Advertisement" src="http://ads.com.com/Ads/common/advertisement.gif" style="display:block;height:10px;width:120px;margin:0 auto;"/></div>
<!-- start of gamespot gpt ad tag -->
<div id="div-gpt-ad-1359295192-lb-top">
<script type="text/javascript">
googletag.display('div-gpt-ad-1359295192-lb-top');
</script>
<noscript>
<a href="http://pubads.g.doubleclick.net/gampad/jump?iu=/6975/row/gamespot.com/home&sz=728x90|970x66|970x150|970x250|960x150&t=pos%3Dtop%26platform%3Ddesktop%26&c=1359295192">
<img src="http://pubads.g.doubleclick.net/gampad/ad?iu=/6975/row/gamespot.com/home&sz=728x90|970x66|970x150|970x250|960x150&t=pos%3Dtop%26platform%3Ddesktop%26&c=1359295192"/>
</a>
</noscript>
</div>
<!-- end of gamespot gpt tag -->
</div>
如果comment
是对该代码段中第一条评论的引用,则allnext()
生成器会给我:
>>> list(allnext(comment))
[u'\n', <div id="div-gpt-ad-1359295192-lb-top">
<script type="text/javascript">
googletag.display('div-gpt-ad-1359295192-lb-top');
</script>
<noscript>
<a href="http://pubads.g.doubleclick.net/gampad/jump?iu=/6975/row/gamespot.com/home&sz=728x90|970x66|970x150|970x250|960x150&t=pos%3Dtop%26platform%3Ddesktop%26&c=1359295192">
<img src="http://pubads.g.doubleclick.net/gampad/ad?iu=/6975/row/gamespot.com/home&sz=728x90|970x66|970x150|970x250|960x150&t=pos%3Dtop%26platform%3Ddesktop%26&c=1359295192"/>
</a>
</noscript>
</div>, u'\n']