2015-10-13 90 views
-1

如何基於某個其他屬性的搜索來獲取value屬性?使用SED提取具有特定名稱的所有輸入元素的值

例如:

<body> 
<input name="dummy" value="foo"> 
<input name="alpha" value="bar"> 
</body> 

如何獲得名爲「虛擬」的輸入元素的值?

+1

你可以用這個命令得到它。 sed -n's /.* input name =「dummy」value =「\([^」] * \)「。*/\ 1/p'但是對於這個工作,html/xml解析器是合適的工具 –

回答

1

用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文件。

2

既然你正在尋找一個使用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,解壓縮,./configuremakemake 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" 

它返回「富」。

你爲什麼會/不會想用這個辦法

+0

事後我回來了,我真的不認爲這是一個好的答案 - 它很尷尬,也很複雜,並且不遵循@ Ramana的建議,因爲它仍然使用SED解析元素屬性,我做了更多的研究並回答再次,用不同的方法 – alexanderbird

2

既然你要求SED,我會假設你想要一個命令行選項。但是,爲html解析構建的工具可能更有效。我的第一個答案的問題是,我不知道在css中選擇屬性值的方法(是否有其他人?)。但是,使用xml,您可以像選擇其他元素一樣選擇屬性。這是一個使用xml解析工具的命令行選項。

將其視爲XML;使用XPATH

  1. 用包管理器安裝xmlstarlet
  2. 運行xmlstarlet sel -t -v //input[@name=\'dummy\']/@value example.html(其中包含example.html的你的HTML
  3. 如果你的HTML是不是有效的XML,遵守警告從xmlstarlet進行必要的修改(在這種情況下,<input>必須改變,以<input/>
  4. 再次運行該命令將返回:foo

爲什麼你可能/可能不會使用這種方法

相關問題