简要说明:我有一个循环遍历页面元素的脚本,然后返回数据。但我希望它返回不在元素中的数据,而是按顺序返回。
import argparse, os, socket, urllib2, re
from bs4 import BeautifulSoup
pge = urllib2.urlopen("").read()
src = BeautifulSoup(pge)
body = src.findAll('body')
el = body[0].findChildren()
for s in el:
cname = s.get('class')
if cname[0] == "work":
print s.text
HTML:
<body>
<div class="work">1</div>
<span class="nope">tosee</span>
<span class="work">2</span>
<span class="work">3</span>
4
<span class="work">5</span>
<span class="no">nothing</span>
</body>
它打印1235并错过了4,但我想要它打印12345
答案 0 :(得分:1)
简单地:
print soup.find('body').text
答案 1 :(得分:0)
我使用换行符格式化你的html,以帮助显示为什么4不打印你想要的地方。
您正在迭代子节点并从“工作”类中的任何子节点打印文本。数字4不符合这个标准,因为它是文本,而不是具有“工作”类的孩子。
我不认为BeautifulSoup可以像您期望的那样解码这个特定的HTML。
一种解决方案是自己解析html,因为这不是典型的情况。一种方法可能是使用正则表达式来查找类似的实例:
</span>(not_blank)<span class="{classregex}">(remember)</span>
建立{remember:not_blank}字典。然后当你遍历body.children()时,对这个字典验证s.text()。如果是键,则打印该值,然后打印s.text()。
取决于实际的html可能有用......
答案 2 :(得分:0)
你可以这样做:
arr = []
# Get all text elements
for i in body[0].find_all(text=True):
# append to array if it's 'work' element or has no class
if not i.parent.has_attr("class") or "work" in i.parent["class"]:
arr.append(i)
这当然只有在遵循两条规则始终有效时才有效: