给了我一个数据集,我需要将嵌入单元格中的html转换为干净的html剥离的csv。给出了预期的结果。在html内是单独标识的文件,每个文件都必须是其自己的行。这些列位于单独的单元格中,并且具有单独的关键字(也嵌入在HTML中),需要生成到新的列中并标识为TRUE(条件是在行中找到关键字)或FALSE(条件是未找到关键字)在该行中)。解决方案需要对先前生成并标识为TRUE的关键字敏感。
我一直在搜索类似的问题作为示例,但是这个问题似乎是由于我的已知技术语言(我不是数据清理专家)或要求不寻常。
这是CSV中的典型行...
"<div id="categories">
<h3>Categories</h3>
<ul>
<li><a href="">Keyword1</a></li>
<li><a href="">Keyword2</a></li>
</ul>
</div>
","<div id="file"><h3>File</h3>, <div id="image">
<a href="A">A.jpg</a>
<br/></div>
, <div id="image">
<a href="B">B.jpg</a>
<br/></div>
</div>
"
每行中关键字和文件的数量各不相同。
预期结果
File, Keyword1, Keyword2, Keyword3
A.jpg, TRUE, TRUE, FALSE
B.jpg, TRUE, TRUE, FALSE
C.jpg, TRUE, FALSE, TRUE
D.jpg, FALSE, FALSE, TRUE
E.jpg, FALSE, FALSE, TRUE
这是使用以下方法获得所需输出的一种方法BeautifulSoup
:
from bs4 import BeautifulSoup as bs
a = '''
<div id="categories">
<h3>Categories</h3>
<ul>
<li><a href="">Keyword1</a></li>
<li><a href="">Keyword2</a></li>
</ul>
</div>
","
<div id="file">
<h3>File</h3>,
<div id="image">
<a href="A">A.jpg</a>
<br/>
</div>
,
<div id="image">
<a href="B">B.jpg</a>
<br/>
</div>
</div>
'''
def find_elms(soup, tag, attribute):
"""Find the block using it's tag and attribute values"""
categories_block = soup.find(tag, attribute)
if categories_block:
return [elm.text for elm in categories_block.findAll('a')]
return []
def pretty_print(master, categories, files):
"""Here we're just better printing the output"""
cat = '\t'.join(['{elm:<12}'.format(elm=elm) for elm in master])
print(cat)
for k in files:
out = '{file_:<12}'.format(file_=k)
cells = '\t'.join(
['{:<12}'.format(str(True if j in categories else False)) for j in master[1:]]
)
print(out, cells)
master_categories = ['File', 'Keyword1', 'Keyword2', 'Keyword3']
soup = bs(a, 'html.parser')
categories = find_elms(soup, 'div', {'id': 'categories'})
files = find_elms(soup, 'div', {'id': 'file'})
pretty_print(master_categories, categories, files)
输出:
File Keyword1 Keyword2 Keyword3
A.jpg True True False
B.jpg True True False
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句