问题场景:
需要将一些 HTML 内容转换为表格形式展示,HTML 内容很简单且格式是固定的。需要在服务器上操作,没有权限安装其它运行环境,只好选择 SHELL 脚本完成。
HTML 内容:
所有文件的内容格式都如同下面这样。
<html> <head> <title>Demo</title> </head> <body> <h1>Page Title</h1> <div class="row"> <p class="text-1">Text 1</p> <p class="text-2">Text 2</p> <p class="text-3">Text 3</p> <p class="text-4">Text 4</p> <p class="text-5">Text 5</p> <p class="text-6">Text 6</p> </div> <div class="row"> <p class="text-1">Text 1</p> <p class="text-2">Text 2</p> <p class="text-3">Text 3</p> <p class="text-4">Text 4</p> <p class="text-5">Text 5</p> <p class="text-6">Text 6</p> </div> <div class="row"> <p class="text-1">Text 1</p> <p class="text-2">Text 2</p> <p class="text-3">Text 3</p> <p class="text-4">Text 4</p> <p class="text-5">Text 5</p> <p class="text-6">Text 6</p> </div> </body> </html>
需要转换如下表格格式:
<table> <caption>Page Title</caption> <thead> <tr> <th>Hard Code</th> <th>Hard Code</th> <th>Hard Code</th> <th>Hard Code</th> <th>Hard Code</th> <th>Hard Code</th> </tr> </thead> <tbody> <tr> <td>Text 1</td> <td>Text 2</td> <td>Text 3</td> <td>Text 4</td> <td>Text 5</td> <td>Text 6</td> </tr> <tr> <td>Text 1</td> <td>Text 2</td> <td>Text 3</td> <td>Text 4</td> <td>Text 5</td> <td>Text 6</td> </tr> <tr> <td>Text 1</td> <td>Text 2</td> <td>Text 3</td> <td>Text 4</td> <td>Text 5</td> <td>Text 6</td> </tr> </tbody> </table>
这是一张示意图:
为方便提取 HTML 内容,选用了 pup 这个工具 https://github.com/ericchiang/pup
它基于 CSS 选择器工作,例如要提取的内容使用下面命令。
# Extracting page titles
cat demo.html | pup 'body > h1 text{}'
# Extracting paragraph text
cat demo.html | pup 'body > div.row > p.text-1 text{}'
cat demo.html | pup 'body > div.row > p.text-2 text{}'
cat demo.html | pup 'body > div.row > p.text-3 text{}'
cat demo.html | pup 'body > div.row > p.text-4 text{}'
cat demo.html | pup 'body > div.row > p.text-5 text{}'
cat demo.html | pup 'body > div.row > p.text-6 text{}'
于是写了下面这个 SHELL 脚本(没写过 SHELL 脚本的小白……)
#!/usr/bin/env bash
# Extracts HTML content
page_title=$(cat demo.html | pup 'body > h1 text{}')
paragraph_text_a=$(cat demo.html | pup 'body > div.row > p.text-1 text{}')
paragraph_text_b=$(cat demo.html | pup 'body > div.row > p.text-2 text{}')
paragraph_text_c=$(cat demo.html | pup 'body > div.row > p.text-3 text{}')
paragraph_text_d=$(cat demo.html | pup 'body > div.row > p.text-4 text{}')
paragraph_text_e=$(cat demo.html | pup 'body > div.row > p.text-5 text{}')
paragraph_text_f=$(cat demo.html | pup 'body > div.row > p.text-6 text{}')
# Print the contents in a predetermined format
cat << EOF
<table>
<caption>$page_title</caption>
<thead>
<tr>
<th>Hard Code</th>
<th>Hard Code</th>
<th>Hard Code</th>
<th>Hard Code</th>
<th>Hard Code</th>
<th>Hard Code</th>
</tr>
</thead>
<tbody>
<tr>
<td>$paragraph_text_a</td>
<td>$paragraph_text_b</td>
<td>$paragraph_text_c</td>
<td>$paragraph_text_d</td>
<td>$paragraph_text_e</td>
<td>$paragraph_text_f</td>
</tr>
</tbody>
</table>
EOF
上面的脚本显然不能正常工作,输出内容都写在一行表格里了。正常应该每个 <div class="row">...</div>
块内容转换一行表格内容。
所以这里请教下各位大佬,应该怎么修改可以让它按预期工作?折腾了好久没解决……
![]() |
1
oneisall8955 2020-08-07 23:11:50 +08:00 via Android
坐等大佬们撸一个人,(话说,学会正则应该很简单吧,shell 需要学习一些语法,新手应该觉得有点费时间咯)
|
![]() |
2
ysc3839 2020-08-08 05:02:23 +08:00 via Android
既然可以用 pup,那就直接用 golang 写个程序处理吧,别用 shell 了。
|