我试图通过BeautifulSoup刮掉嵌套元素,我已经把头发拉了几天了。到目前为止,我是一名新手 - 所以我希望这个问题的简单性不会冒犯任何人。尽管如此,任何能力的任何帮助将不胜感激。
这是我试图抓的HTML。
<div id="specs" class="pane">
<div class="col">
<ul class="list">
<li>
<ul>
<li><b>width</b>2</li>
<li><b>length</b>1</li>
<li><b>color</b>blue</li>
<li><b>metal</b>steel</li>
</ul>
</li>
</ul>
</div>
</div>
在一个完美的世界里,这是我的结果......
width, 2
length, 1
color, blue
metal, steel
虽然我已经接近了,但我知道现在这不是答案......但与此同时,我似乎无法循环使用li元素。
div = div.find("div", {"id":"specifications"})
result = [i for i in div.find('li')]
如果有人能够向正确的方向推动一个初学者,那将非常感激,并提前感谢您的任何见解!
答案 0 :(得分:0)
您可以通过select()
使用CSS选择器来查找目标b
元素,例如:
from bs4 import BeautifulSoup
raw = '''<div id="specs" class="pane">
<div class="col">
<ul class="list">
<li>
<ul>
<li><b>width</b>2</li>
<li><b>length</b>1</li>
<li><b>color</b>blue</li>
<li><b>metal</b>steel</li>
</ul>
</li>
</ul>
</div>
</div>'''
soup = BeautifulSoup(raw, "lxml")
result = soup.select("div#specs b")
for r in result:
print r.get_text(), r.next_sibling
输出
width 2
length 1
color blue
metal steel
以下是用于比较的纯lxml.html
替代方案(因为OP似乎对lxml
感兴趣,从下面的评论来看)。输出与上面的BS片段完全相同。
from lxml import html
raw = '''assume the same XML as in the previous snippet'''
root = html.fromstring(raw)
result = root.cssselect("div#specs b")
for b in result:
print b.text, b.tail
lxml
支持XPath(通过xpath()
)和CSS选择器(通过cssselect()
)和lxml
is fast。