如何清除HTML文本数据中的CSS元素?

时间:2019-08-29 18:33:00

标签: python pandas dataframe data-structures data-cleaning

我正在处理来自许多不同网页的长文本数据,这意味着大多数数据都是不一致的。我以html主体的形式下载了它,然后使用BeautifulSoup和regex模式剥离了HTML标签。但是,大量文本包含一些css标记,而regex或bs4都不希望删除。我需要纯净的文本,没有任何html / css字符串。我愿意接受某些错误率(某些文档仍然“脏”或部分“脏”)。

我需要从文档中删除的字符串示例:

DOC1(css之后是文本)

6484,"{""
img.wp-smiley,
img.emoji {
    display: inline !important;
    border: none !important;
    box-shadow: none !important;
    height: 1em !important;
    width: 1em !important;
    margin: 0 .07em !important;
    vertical-align: -0.1em !important;
    background: none !important;
    padding: 0 !important;
}
"",""
        .so-mobilenav-mobile + * { display: none; }
        @media screen and (max-width: 480px) { .so-mobilenav-mobile + * { display: block; } .so-mobilenav-standard + * { display: none; } }
    "",""
        #footer-widgets .widget { width: 20%; }
        @media screen and (max-width: 640px) {
            #footer-widgets .widget { width: auto; float: none; }
        }
    "",""/* Layout 6237 */ #pgc-6237-0-0 { width:75% } #pgc-6237-0-1 { width:25% } #pg-6237-0 .panel-grid-cell {  } #pg-6237-0 { margin-left:-15px;margin-right:-15px } #pg-6237-0 .panel-grid-cell { padding-left:15px;padding-right:15px } #pl-6237 .so-panel { margin-bottom:35px } #pl-6237 .so-panel:last-child { margin-bottom:0px } @media (max-width:780px){ #pl-6237 .panel-grid-cell { float:none;width:auto } #pl-6237 .panel-grid { margin-left:0;margin-right:0 } #pl-6237 .panel-grid-cell { padding:0 } #pl-6237 .panel-grid .panel-grid-cell-empty { display:none } #pl-6237 .panel-grid .panel-grid-cell-mobile-last , #pg-6237-0 .panel-grid-cell:last-child { margin-bottom:0px } #pg-6237-0 .panel-grid-cell { margin-bottom:35px }  } "",""
#secondary {
    width: 23.762%;
    float: left !important;
}

#primary {
    width: 71.287%;
    float: right !important;
}

.entry-content a {
    text-decoration: none;
    color: #00577e;
}

.entry-content a:hover {
    text-decoration: none;
    color: #e7962d;
}

.entry-content h1 {
    font-size: 20px;
}

#page-wrapper {
    padding-top: 0px;
}

.entry-content img {
    -webkit-border-radius: 0px;
    -moz-border-radius: 0px;
  border-radius: 0px;
}

header#masthead .hgroup #header-sidebar {
    display: block;
}

或者例如

DOC2(css之后是文本)

6466,"{""
@import url(\""https://dvinci.com/modules/system/system.base.css?pwnc7z\"");
"",""
@import url(\""https://dvinci.com/sites/all/modules/contrib/jquery_update/replace/ui/themes/base/minified/jquery.ui.core.min.css?pwnc7z\"");
@import url(\""https://dvinci.com/sites/all/modules/contrib/jquery_update/replace/ui/themes/base/minified/jquery.ui.theme.min.css?pwnc7z\"");
"",""
@import url(\""https://dvinci.com/sites/all/modules/colorbox_node/colorbox_node.css?pwnc7z\"");
@import url(\""https://dvinci.com/sites/all/modules/contrib/date/date_api/date.css?pwnc7z\"");
@import url(\""https://dvinci.com/modules/field/theme/field.css?pwnc7z\"");
@import url(\""https://dvinci.com/modules/node/node.css?pwnc7z\"");
@import url(\""https://dvinci.com/sites/all/modules/contrib/views/css/views.css?pwnc7z\"");
@import url(\""https://dvinci.com/sites/all/modules/lazyloader/lazyloader.css?pwnc7z\"");

还有更多示例,但这说明了问题。 我最后需要的是纯文本-单词和句子。

我该如何完成这项任务?

我的最初想法是将包含css标记的文档与不包含css标记的文档进行比较,提取那些css标记(因为它们只能在一种文档中找到)并将它们从所有文档中删除。这仅在一定程度上有所帮助。我可以删除带有css标记的文档,但这意味着删除大约60-70%的所有数据库。

有人遇到类似的问题并找到了有效的解决方案而又没有多少数据丢失吗?

请注意: CSS标签格式不一致。 CSS在每个文档中都有不同的长度。 它们有时包含唯一元素(即图像名称)。 关于css格式何时结束以及文本何时开始,没有明确的指示符。有时,文本以]或}或)开头;或其他任何内容。

0 个答案:

没有答案