使用b4进行抓取时排除隐藏的标记

时间:2014-11-24 21:58:34

标签: python html python-2.7 beautifulsoup html-parsing

我的网站在html中有很多隐藏的标签。 我已粘贴下面的源代码。 挑战在于隐藏标签有两种类型,

1. style="display:none"

2.他们有每个td标记下提到的样式列表。

它随每个td标签而变化。 对于下面的示例,它具有以下样式,

hLcj{display:none}
.J9pE{display:inline}
.kUC-{display:none}
.Dzkb{display:inline}
.mXJU{display:none}
.DZqk{display:inline}
.rr9s{display:none}
.nGF_{display:inline}

因此class=hLcj, kUC, mXJU, rr9s,etc元素是隐藏元素

我想提取整个tr的文本但排除这些隐藏的标签。 我一直在摸不着头几个小时但仍然没有成功。

非常感谢任何帮助。谢谢 我正在使用bs4python 2.7

<td class="leftborder timestamp" rel="1416853322">
<td>
<span>
<style>
.hLcj{display:none}
.J9pE{display:inline}
.kUC-{display:none}
.Dzkb{display:inline}
.mXJU{display:none}
.DZqk{display:inline}
.rr9s{display:none}
.nGF_{display:inline}
</style>
<span class="rr9s">35</span>
<span></span>
<div style="display:none">121</div>
<span class="226">199</span>
.
<span class="rr9s">116</span>
<div style="display:none">116</div>
<span></span>
<span class="Dzkb">200</span>
<span style="display: inline">.</span>
<span style="display:none">86</span>
<span class="kUC-">86</span>
<span></span>
120
<span class="kUC-">134</span>
<div style="display:none">134</div>
<span class="mXJU">151</span>
<div style="display:none">151</div>
<span class="rr9s">154</span>
<span class="Dzkb">.</span>
<span class="119">36</span>
<span class="kUC-">157</span>
<div style="display:none">157</div>
<span class="rr9s">249</span>
<div style="display:none">249</div>
</span>
</td>
<td> 7808</td>

1 个答案:

答案 0 :(得分:1)

使用selenium可以使任务变得更加容易,因为它知道哪些元素被隐藏,哪些元素不是。

但是,无论如何,这是一个基本代码,您可能需要进一步改进。这里的想法是解析style标记并获取要排除的类列表,列出要排除的标记列表并检查style中每个子元素的tr属性:< / p>

import re
from bs4 import BeautifulSoup

data = """ your html here """

soup = BeautifulSoup(data)
tr = soup.tr

# get classes to exclude
classes_to_exclude = []
for line in tr.style.text.split():
    match = re.match(r'^\.(.*?)\{display:none\}', line)
    if match:
        classes_to_exclude.append(match.group(1))

tags_to_exclude = ['style', 'script']

texts = []
for item in tr.find_all(text=True):
    if item.parent.name in tags_to_exclude:
        continue

    class_ = item.parent.get('class')
    if class_ and class_[0] in classes_to_exclude:
        continue

    if item.parent.get('style') == 'display:none':
        continue

    texts.append(item)

print ''.join(texts.strip())

打印:

199.200.120.36

另见: