从 Html 文件 <td> 元素中提取值
Extracting values from Html file <td> elements
我有以下字符串:
<td class="mytest" title="testfile" style="width:20%">0</td>
如何使用 awk 在 td 元素中获取值?在我的例子中,它是 0.
我是 Linux 的新手,非常感谢您的帮助!
一种选择是使用 xmllint (xmllint --html
) with an xpath 提取值。
示例:
#!/bin/bash
data='<td class="mytest" title="testfile" style="width:20%">0</td>'
value=$(xmllint --html --xpath '//html/body/td/text()' - <<< "$data")
echo "$value"
输出:
0
如果你被允许select你的工具我建议使用hxselect
(来自html-xml-utils
),然后如果你file.txt
持有
<td class="mytest" title="testfile" style="width:20%">0</td>
它会像
一样简单
cat file.txt | hxselect -i -c td
产出
0
说明:-i
匹配不区分大小写,-c
只打印内容,td
是CSSselect或。免责声明:0
后没有换行符,因为标签内没有换行符。
但是,如果您被迫使用安装基础,那么如果您使用的 linux 机器已经安装了 python
(如果我没记错的话,最近的 Ubuntu
版本确实有默认情况下),您可以按如下方式利用 html.parser
,创建具有以下内容的 tdextract.py
文件
import sys
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def __init__(self):
self.insidetd = False
super().__init__()
def handle_starttag(self, tag, attrs):
if tag == "td":
self.insidetd = True
def handle_endtag(self, tag):
if tag == "td":
self.insidetd = False
def handle_data(self, data):
if self.insidetd:
sys.stdout.write(data)
parser = MyHTMLParser()
parser.feed(sys.stdin.read())
然后做
cat file.txt | python tdextract.py
这将给出与前面描述的 hxselect
相同的输出。请注意 python
使用缩进来标记块,因此保持前导空格的数量至关重要。
如果您的输入总是那么规律,并且您没有也不能安装支持 XML 的工具,那么在每个 Unix 机器上使用任何 shell 中的任何 sed:
$ sed 's:<td.*>\(.*\)</td>::' file
0
我使用 sed 而不是 awk,因为 sed 最适合像这样在单行上进行简单替换。使用 GNU awk,您可以使用第三个参数来匹配 ():
$ awk 'match([=11=],"<td.*>(.*)</td>",a){print a[1]}' file
0
但使用 POSIX awk 会更神秘一些(当然还有其他方法):
$ awk 'sub("</td>","") && sub("<td.*>","")' file
0
想一想上面的内容并对其进行测试以确保您没有得到任何错误的匹配项。匹配你想要的总是比不匹配你不想要的相似字符串容易得多。
我有以下字符串:
<td class="mytest" title="testfile" style="width:20%">0</td>
如何使用 awk 在 td 元素中获取值?在我的例子中,它是 0.
我是 Linux 的新手,非常感谢您的帮助!
一种选择是使用 xmllint (xmllint --html
) with an xpath 提取值。
示例:
#!/bin/bash
data='<td class="mytest" title="testfile" style="width:20%">0</td>'
value=$(xmllint --html --xpath '//html/body/td/text()' - <<< "$data")
echo "$value"
输出:
0
如果你被允许select你的工具我建议使用hxselect
(来自html-xml-utils
),然后如果你file.txt
持有
<td class="mytest" title="testfile" style="width:20%">0</td>
它会像
一样简单cat file.txt | hxselect -i -c td
产出
0
说明:-i
匹配不区分大小写,-c
只打印内容,td
是CSSselect或。免责声明:0
后没有换行符,因为标签内没有换行符。
但是,如果您被迫使用安装基础,那么如果您使用的 linux 机器已经安装了 python
(如果我没记错的话,最近的 Ubuntu
版本确实有默认情况下),您可以按如下方式利用 html.parser
,创建具有以下内容的 tdextract.py
文件
import sys
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def __init__(self):
self.insidetd = False
super().__init__()
def handle_starttag(self, tag, attrs):
if tag == "td":
self.insidetd = True
def handle_endtag(self, tag):
if tag == "td":
self.insidetd = False
def handle_data(self, data):
if self.insidetd:
sys.stdout.write(data)
parser = MyHTMLParser()
parser.feed(sys.stdin.read())
然后做
cat file.txt | python tdextract.py
这将给出与前面描述的 hxselect
相同的输出。请注意 python
使用缩进来标记块,因此保持前导空格的数量至关重要。
如果您的输入总是那么规律,并且您没有也不能安装支持 XML 的工具,那么在每个 Unix 机器上使用任何 shell 中的任何 sed:
$ sed 's:<td.*>\(.*\)</td>::' file
0
我使用 sed 而不是 awk,因为 sed 最适合像这样在单行上进行简单替换。使用 GNU awk,您可以使用第三个参数来匹配 ():
$ awk 'match([=11=],"<td.*>(.*)</td>",a){print a[1]}' file
0
但使用 POSIX awk 会更神秘一些(当然还有其他方法):
$ awk 'sub("</td>","") && sub("<td.*>","")' file
0
想一想上面的内容并对其进行测试以确保您没有得到任何错误的匹配项。匹配你想要的总是比不匹配你不想要的相似字符串容易得多。