【问题标题】:Exclude hidden tags while scraping using b4使用 b4 抓取时排除隐藏标签
【发布时间】:2015-01-22 18:16:52
【问题描述】:

我有一个在 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>

【问题讨论】:

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


    【解决方案1】:

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

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

    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
    

    另见:

    【讨论】:

    • 你太棒了!谢谢你,alecxe
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2019-07-23
    • 2021-06-18
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多