我的网站在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的文本但排除这些隐藏的标签。 我一直在摸不着头几个小时但仍然没有成功。
非常感谢任何帮助。谢谢
我正在使用bs4
和python 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>
答案 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
另见: