【发布时间】:2021-06-27 17:30:24
【问题描述】:
我有以下 HTML 结构,并希望使用 awk 从中提取数据。
<body>
<div>...</div>
<div>...</div>
<div class="body-content">
<div>...</div>
<div class="product-list" class="container">
<div class="w3-row" id="product-list-row">
<div class="w3-col m2 s4">
<div class="product-cell">
<div class="product-title">Product A</div>
<div class="product-price">100,56</div>
</div>
</div>
<div class="w3-col m2 s4">
<div class="product-cell">
<div class="product-title">Product B</div>
<div class="product-price">200,56</div>
</div>
</div>
<div class="w3-col m2 s4">
<div class="product-cell">
<div class="product-title">Product C</div>
<div class="product-price">300,56</div>
</div>
</div>
<div class="w3-col m2 s4">
<div class="product-cell">
<div class="product-title">Product D</div>
<div class="product-price">400,56</div>
</div>
</div>
</div>
</div>
</div>
</body>
我想要的结果如下。
100,56
200,56
300,56
400,56
我正在试验以下awk 脚本(我知道选择product-price 两次没有意义,我正要修改这个脚本)
awk -F '<[^>]+>' 'found { sub(/^[[:space:]]*/,";"); print title $0; found=0 } /<div class="product-price">/ { title=$2 } /<div class="product-price">/ { found=1 }'
但它给了我结果
100,56 </div>
200,56 </div>
300,56 </div>
400,56 </div>
我之前从未使用过awk,所以无法弄清楚这里出了什么问题或如何修改上面的代码。你会怎么做呢?
【问题讨论】:
-
你能用一个能理解
xml的工具来代替吗,例如xmlstarlet? -
Awk 是用于多种文本搜索的出色工具,但它不适合 HTML 等层次结构。使用专为这项工作设计的工具会更好。 @Ed Morton 的建议
xmlstarlet是从 shell 使用的不错选择。或者,如果您了解任何脚本语言(例如 Perl、Python、Ruby、Javascript 等),它们中的大多数都有用于 HTML 解析的可安装库。 -
实际上,GNU awk 也有一个 XML 库 - 请参阅 gawkextlib.sourceforge.net/xml/xml.html。
-
@EdMorton 是的,尽管上次我检查了安装 gawk 附加组件并不像使用 cpanm、pip、gem、npm 等那样简单。