我希望使用beutifulsouop在span
部分中提取具有特定class
值的文本,并使用div
部分提取具有不同class
值的文本,同时保留顺序。
以下工作,但不保留订单[即该列表最后包含所有div
个元素,而不是它们出现在页面中的时间
extract = soup.findAll('span', {"class": "value1"})
extract += soup.findAll('div', {"class": "value2"})
注意 - 这与问题BeautifulSoup findAll() given multiple classes?略有不同,因为我专门查看span
和div
代码。
答案 0 :(得分:3)
没有什么可以防止过滤掉错误的标签。扩展你提到的答案:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<html><body><div class="class1"></div><i class="class1"></i><span class="class2"></span><div class="class1"></div></body></html>')
for e in soup.findAll(True, {"class":["class1", "class2"]}):
if e.name in ("div", "span"):
print e
过滤器也可以写成一行:
[e for e in soup.findAll(True, {"class":["class1", "class2"]}) if e.name in ("div", "span")]
顺便说一下,即使这样也行不通:
soup.findAll(["div", "span"], {"class":["class1", "class2"]})
有关可以找到所有内容的第一个参数的文档,请参阅http://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-name-argument。