Beautifulsoup 分解()

Posted

技术标签:

【中文标题】Beautifulsoup 分解()【英文标题】:Beautifulsoup decompose() 【发布时间】:2017-02-14 13:42:19 【问题描述】:

我正在尝试使用 beatifulsoup 删除 <script> 标签和标签内的内容。我去了文档,似乎是一个非常简单的调用函数。有关该功能的更多信息是here。这是我目前解析的html页面的内容...

<body class="pb-theme-normal pb-full-fluid">
    <div class="pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links" id="wp-adb-c" style="width: 1px !important;
    height: 1px !important;
    position: absolute !important;
    left: -10000px !important;
    top: -1000px !important;
    ">
</div>
<div id="pb-f-a">
</div>
    <div class="" id="pb-root">
    <script>
    (function(a)
        TWP=window.TWP||;
        TWP.Features=TWP.Features||;
        TWP.Features.Page=TWP.Features.Page||;
        TWP.Features.Page.PostRecommends=;
        TWP.Features.Page.PostRecommends.url="https://recommendation-hybrid.wpdigital.net/hybrid/hybrid-filter/hybrid.json?callback\x3d?";
        TWP.Features.Page.PostRecommends.trackUrl="https://recommendation-hybrid.wpdigital.net/hybrid/hybrid-filter/tracker.json?callback\x3d?";
        TWP.Features.Page.PostRecommends.profileUrl="https://usersegment.wpdigital.net/usersegments";
        TWP.Features.Page.PostRecommends.canonicalUrl=""
    )(jQuery);

    </script>
    </div>
</body>

想象一下,您有一些类似的 Web 内容,并且您在一个名为 soup_html 的 BeautifulSoup 对象中拥有它。如果我运行soup_html.script.decompose() 并且他们调用对象soup_html 脚本标签仍然存在。我怎样才能摆脱&lt;script&gt; 和这些标签内的内容?

markup = 'The html above'
soup = BeautifulSoup(markup)
html_body = soup.body

soup.script.decompose()

html_body

【问题讨论】:

粘贴您正在运行的实际代码。当我测试您描述的步骤时,一切都很好。 编辑另外,你错过了一个结束 div,但这对 BS 来说没问题 【参考方案1】:

soup.script.decompose()

这只会从“汤”中删除一个单个脚本元素。相反,我认为您的意思是分解所有这些:

for script in soup("script"):
    script.decompose()

【讨论】:

由于某种原因,decompose() 停止工作。现在我的.txt 文件中有script 代码。我去了文档,说明和以前几乎一样。 # Removing JS and CSS for script in soup('script', 'style'): script.decompose() with open(my_params['q'] + '_' + str(count) + '.txt', 'w') as webpage_out: webpage_out.write(soup.get_text()) print('The file ' + my_params['q'] + '_' + str(count) + '.txt ' + 'has been created successfully.') count += 1 except: pass 感谢分享最简单但非常有效的方法来摆脱一切无用的东西。我现在从这种方法中受益的时间已经足够长了。 :)【参考方案2】:

为了详细说明alecxe提供的答案,这里有一个完整的脚本供大家参考:

selects = soup.findAll('select')
for match in selects:
    match.decompose()

【讨论】:

【参考方案3】:

我能够使用以下代码解决此问题...

scripts = soup.findAll(['script', 'style'])
    for match in scripts:
        match.decompose()
        file_content = soup.get_text()
        # Striping 'ascii' code
        content = re.sub(r'[^\x00-\x7f]', r' ', file_content)
    # Creating 'txt' files
    with open(my_params['q'] + '_' + str(count) + '.txt', 'w+') as webpage_out:
        webpage_out.write(content)
        print('The file ' + my_params['q'] + '_' + str(count) + '.txt ' + 'has been created successfully.')
        count += 1

错误是with open(... 是一部分或for match...

不起作用的代码...

scripts = soup.findAll(['script', 'style'])
    for match in scripts:
        match.decompose()
        file_content = soup.get_text()
        # Striping 'ascii' code
        content = re.sub(r'[^\x00-\x7f]', r' ', file_content)
        # Creating 'txt' files
        with open(my_params['q'] + '_' + str(count) + '.txt', 'w+') as webpage_out:
            webpage_out.write(content)
            print('The file ' + my_params['q'] + '_' + str(count) + '.txt ' + 'has been created successfully.')
            count += 1

【讨论】:

【参考方案4】:

soup.script.decompose() 只会将其从 soup 变量中删除...而不是 html_body 变量。您还必须将其从 html_body 变量中删除。 (我认为。)

【讨论】:

以上是关于Beautifulsoup 分解()的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 解析后返回间隔文本

CSS 选择器:BeautifulSoup4

使用 BeautifulSoup 解析未关闭的 `<br>` 标签

跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手

Beautifulsoup 分解()

Beautifulsoup分解