从标签中获取数据(BeautifulSoup)

时间:2014-01-21 03:27:10

标签: python beautifulsoup

简要说明:我有一个循环遍历页面元素的脚本,然后返回数据。但我希望它返回不在元素中的数据,而是按顺序返回。

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

3 个答案:

答案 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)

这当然只有在遵循两条规则始终有效时才有效:

  1. 有效的文本元素位于类=&#34; work&#34;或
  2. 有效的文本元素位于没有类属性的标记内