我正在使用shell脚本对一个cablemodem的HTML诊断页面源代码进行webscraping,我需要修复一些由Motorola完成的编码错误。在许多页面中有一些事件在输入标记的末尾缺少结束>
,这会破坏事物。由于</td>
之前的值是动态的,我需要能够动态修复标记。
示例字符串:
<td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253 </td>
通过value=253 </td>
如何用“&gt;”替换该空格对于整个页面中的每一次出现?请注意,在这些网页中,</td>
前面有一个空格,因此sed 's/ <\/td>/><\/td>/g'
将无法正常工作。
感谢您的帮助
答案 0 :(得分:0)
虽然它不是很好的HTML,但它不应该破坏你的工具 - 如果你使用的是正确的工具。
要解析HTML,您需要使用DOM解析器。我建议使用XPath。从Linux上的命令行,您可以使用.config(function(uiGmapGoogleMapApiProvider) {
var $injector = angular.injector(['ng'])
var $http = $injector.get('$http')
$http.get(<url to your key>)
.then(function(rsp){
var data = rsp;
uiGmapGoogleMapApiProvider.configure({
key: data.key,
v: '3.20', //defaults to latest 3.X anyhow
libraries: 'weather,geometry,visualization'
})
})
})
,它是包xmllint
的一部分。通过libxml2-utils
(Linux上常见的xml库)可用的DOM解析器可以解析上面的无效输入。
假设您要提取输入值:
libxml2
它会报告HTML解析错误,您可以将其重定向到xmllint --html --xpath '//input[@name="NumberOfCpes"]/@value' test.html
:
/dev/null
但仍然在stdout上给你正确的值:
xmllint --html --xpath '//input[@name="NumberOfCpes"]/@value' test.html 2>/dev/null
然而,当然令人讨厌的是网站产生无效的HTML。
答案 1 :(得分:0)
sed的正则表达式和替换方法
sed -r 's#(<input[^>]+)[[:space:]]*<#\1>#g;s#[[:space:]]+([>])#\1#g'
例如,如果你有以下
<td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253 </td>
您的输出将是
<td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253>/td>`