如何基於某個其他屬性的搜索來獲取value屬性?使用SED提取具有特定名稱的所有輸入元素的值
例如:
<body>
<input name="dummy" value="foo">
<input name="alpha" value="bar">
</body>
如何獲得名爲「虛擬」的輸入元素的值?
如何基於某個其他屬性的搜索來獲取value屬性?使用SED提取具有特定名稱的所有輸入元素的值
例如:
<body>
<input name="dummy" value="foo">
<input name="alpha" value="bar">
</body>
如何獲得名爲「虛擬」的輸入元素的值?
用sed解析HTML通常是一個壞主意,因爲sed以基於行的方式工作,而HTML通常不會考慮換行符在語法上很重要。 HTML重新格式化時,如果HTML處理工具中斷,這並不好。
相反,請考慮使用Python,它的標準庫中有一個HTML推送解析器。例如:
#!/usr/bin/python
from HTMLParser import HTMLParser
from sys import argv
# Our parser. It inherits the standard HTMLParser that does most of
# the work.
class MyParser(HTMLParser):
# We just hook into the handling of start tags to extract the
# attribute
def handle_starttag(self, tag, attrs):
# Build a dictionary from the attribute list for easier
# handling
attrs_dict = dict(attrs)
# Then, if the tag matches our criteria
if tag == 'input' \
and 'name' in attrs_dict \
and attrs_dict['name'] == 'dummy':
# Print the value attribute (or an empty string if it
# doesn't exist)
print attrs_dict['value'] if 'value' in attrs_dict else ""
# After we defined the parser, all that's left is to use it. So,
# build one:
p = MyParser()
# And feed a file to it (here: the first command line argument)
with open(argv[1], 'rb') as f:
p.feed(f.read())
保存此代碼,也就是說,foo.py
,然後運行
python foo.py foo.html
其中foo.html
是HTML文件。
既然你正在尋找一個使用bash和sed的解決方案,我假設你正在尋找一個Linux命令行選項。
hxselect
html解析工具來提取元素;使用sed
從元素獲取價值我做了谷歌搜索「Linux的bash的解析HTML工具」和跨越這來了:https://unix.stackexchange.com/questions/6389/how-to-parse-hundred-html-source-code-files-in-shell
接受的答案建議使用hxselect
工具從中提取基於元素html-xml-utils package一個CSS選擇器。 所以在安裝後(downoad,解壓縮,./configure
,make
,make install
),您可以使用給定的CSS選擇
hxselect "input[name='dummy']" < example.html
(鑑於example.html的包含從您的問題例如HTML)。這將運行此命令返回:
<input name="dummy" value="foo"/>
幾乎在那裏。我們需要從該行提取值:
hxselect "input[name='dummy']" < example.html | sed -n -e "s/^.*value=['\"]\(.*\)['\"].*/\1/p"
它返回「富」。
事後我回來了,我真的不認爲這是一個好的答案 - 它很尷尬,也很複雜,並且不遵循@ Ramana的建議,因爲它仍然使用SED解析元素屬性,我做了更多的研究並回答再次,用不同的方法 – alexanderbird
既然你要求SED,我會假設你想要一個命令行選項。但是,爲html解析構建的工具可能更有效。我的第一個答案的問題是,我不知道在css中選擇屬性值的方法(是否有其他人?)。但是,使用xml,您可以像選擇其他元素一樣選擇屬性。這是一個使用xml解析工具的命令行選項。
xmlstarlet
xmlstarlet sel -t -v //input[@name=\'dummy\']/@value example.html
(其中包含example.html的你的HTML<input>
必須改變,以<input/>
foo
你可以用這個命令得到它。 sed -n's /.* input name =「dummy」value =「\([^」] * \)「。*/\ 1/p'但是對於這個工作,html/xml解析器是合適的工具 –