【发布时间】:2020-06-23 21:50:53
【问题描述】:
这是我通过从 docx 转换为 html 获得的输入数据/文件。由于这个原因,该文件是“不漂亮”的 html。
<p><strong>TABLE 1 EUR A++ AT JON DOE'S PLACE 27-06-2020</strong></p><p> 13.30 1 Jennifer Shea (R) 27-06 29.99 Tea 1/1 Fish and chips or Salad and rice</p><p> 15.00 2 Micheal Beltran (R) 27-06 30.99 Wine 2/2 Vegan super silky puff pastry</p><p> 16.00 3 <strong>DARIUS GALLAGHER (IP)</strong> 27-06 29.99 Wine Premium 4/4 Pear pecan and blue cheese salad</p><p> 18.00 4 Ashanti Fields (R) 27-06 N/A Wine 2/0 </p>
将文件/数据读入 Python(使用 bs4),在第 2 行我们看到:
'\t13.30\t1\tJennifer Shea (R)\t\t27-06\t29.99\tTea\t1/1\tFish and chips or Salad and rice'
<p></p> 标记内的文本用制表符 ('\t') 分隔。
我想将每个<p></p> 行内容分成更小的部分(i) 使用'\t' 作为分隔符,(ii) 将元素标签更改为表格行和 (iii) 为每个项目设置(预定义)带有类名的标签。例如我想将上面的段落行转换为:
<table>
<tbody>
<tr>
<td colspan="2" class="header-table-no">TABLE 1</td>
<td colspan="2" class="header-currency">EUR</td>
<td colspan="2" class="header-class">A++</td>
<td colspan="2" class="header-place-date">AT JON DOE'S PLACE 27-06-2020</td>
</tr>
<tr>
<td class="cooktable-time">13.30</td>
<td class="cooktable-no">1</td>
<td class="cooktable-name">Jennifer Shea (R)</td>
<td class="cooktable-date">27-06</td>
<td class="cooktable-price">29.99</td>
<td class="cooktable-drink">Tea</td>
<td class="cooktable-ppfood ">1/1</td>
<td class="cooktable-menu">Fish and chips or Salad and rice</td>
</tr>
</tbody>
</table>
还有大约 3000 个表要循环,并且数据是一致的。 到目前为止,我已经设法拆分每一行并添加到一个列表中:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("simplesample.html"), features="lxml")
paragraphs = soup.find_all("p")
delimeter ='\t'
total_list=[]
for i in range(len(paragraphs)):
plist = (paragraphs[i].get_text()).split(delimeter)
total_list.append(plist)
for i in total_list:
print(i)
# Output
['TABLE 1', 'EUR', 'A++', "AT JON DOE'S PLACE 27-06-2020"]
['', '13.30', '1', 'Jennifer Shea (R)', '', '27-06', '29.99', 'Tea', '1/1', 'Fish and chips or Salad and rice']
['', '15.00', '2', 'Micheal Beltran (R)', '', '27-06', '30.99', 'Wine', '2/2', 'Vegan super silky puff pastry']
['', '16.00', '3', 'DARIUS GALLAGHER (IP)', '', '27-06', '29.99', 'Wine Premium', '4/4', 'Pear pecan and blue cheese salad']
['', '18.00', '4', 'Ashanti Fields (R)', '', '27-06', 'N/A', 'Wine', '2/0', '']
编辑:这里的问题是,当我对从 get_text() 获得的数据使用 str.split() 方法时,我会丢失一些格式信息。例如:在原始数据中,第 3 行 'DARIUS GALLAGHER (IP)' 实际上在 <strong></strong> 标签内。但是使用get_text() 自然只会返回字符串值。因此输出变为非粗体。
更新:为了澄清,我想保持 <strong> 原样。除表头外,<strong>标签在数据中随机出现。
问题是:
- 是否有任何 bs4 方法通过保留当前格式来解决此问题,而不是将标签拆分为字符串并添加到列表中?
- 从这里开始,我如何使用 BeautifulSoup 使用预先确定的标签和类名来标记列表元素?
【问题讨论】:
-
你能分享 URL(如果有的话)吗?通常,
beautifulsoup适合解析标签,而不是纯文本 - 因为re模块更好。在这种情况下,我看到它是两者的某种组合。 -
@AndrejKesely 不幸的是没有 URL。我以
.docx格式收到此文件,并使用其他一些工具将其转换为.html。原始文件包含数百个数据,就像我提供的一样。我不太擅长正则表达式,你有什么样的解决方案?谢谢。 -
我发布了答案并建议了它的外观。
标签: html python-3.x parsing beautifulsoup