使用Jinja过滤器对数据进行Ansible HTML解析和grep
实际上,我正在尝试使用Ansible中的Jinja过滤器解析HTML URI GET响应,以获得响应中存在的特定属性 我可以使用搜索,regex_将标记h3和标记I替换为“”,但不确定如何使用下面的其余标记使用Jinja过滤器对数据进行Ansible HTML解析和grep,ansible,Ansible,实际上,我正在尝试使用Ansible中的Jinja过滤器解析HTML URI GET响应,以获得响应中存在的特定属性 我可以使用搜索,regex_将标记h3和标记I替换为“”,但不确定如何使用下面的其余标记 - name: HTML output set_fact: response="{{ webpage.results | map(attribute='content')| select('search', '<h3>')|map('regex_replace',
- name: HTML output
set_fact: response="{{ webpage.results | map(attribute='content')| select('search', '<h3>')|map('regex_replace', '<h3>(.*)</h3>', '\\1')| select('search', '<i>')| map('regex_replace', '<i>(.*)</i>', '\\1')| list }}"
register: response
with_indexed_items: "{{ groups['host-group-name'] }}"
-名称:HTML输出
set|fact:response=“{{webpage.results|map(attribute='content')| select('search','')| map('regex|u replace','(.''),'.''''\\1')| select('search','')| map('regex|u replace',','(.'.'''''''.''''''.'''''''''
寄存器:响应
带有索引项:“{groups['host-group-name']}”
当前HTML“响应”格式
xxxxxxxx
项目1:xxxxxx
项目2:xxxxx
项目3:xxxxx
项目4:${xxxxx}
项目5:xxxxxx
我试图从ansible playbook显示(或注册)的HTML页面响应中仅获取“Item2:Value”或与Item2关联的“Value”您可以使用
xmllint
,正如@ceving建议的那样,但是,您可以使用XPath表达式来查找包含目标值的元素,而不是按索引选择项。例如,要查找包含Item2
的h3
元素:
xmllint --html --xpath '//h3[contains(text(), "Item2")]/text()' data.html
这给了我们:
Item2: Value
仅从中提取值是微不足道的。我们可以用这样的剧本来概括:
---
- hosts: localhost
gather_facts: false
tasks:
- name: parse html
command: xmllint --html --xpath '//h3[contains(text(), "Item2")]/text()' -
args:
stdin: "{{ webpage.results }}"
register: match
- debug:
var: match.stdout
- set_fact:
result: "{{ match.stdout.split(': ')[1] }}"
- debug:
var: result
- command: >-
awk -F"<>" '/Item2/ {print $4}'
args:
stdin: "{{ webpage.results }}"
register: result
您不会在示例HTML中显示它,但如果值包含在
元素中,如Item2:Value
中,则只需将xpath表达式更改为:
//h3/i[contains(text(), "Item2")]/text()
更新
如果输入的HTML无效,则选项会减少,主要是您最初使用的基于正则表达式的解决方案。我可能会把它扔到awk
,如下所示:
---
- hosts: localhost
gather_facts: false
tasks:
- name: parse html
command: xmllint --html --xpath '//h3[contains(text(), "Item2")]/text()' -
args:
stdin: "{{ webpage.results }}"
register: match
- debug:
var: match.stdout
- set_fact:
result: "{{ match.stdout.split(': ')[1] }}"
- debug:
var: result
- command: >-
awk -F"<>" '/Item2/ {print $4}'
args:
stdin: "{{ webpage.results }}"
register: result
-命令:>-
awk-F“'/Item2/{print$4}”
args:
stdin:“{webpage.results}”
寄存器:结果
根据您在问题中提供的示例数据,这将以
结果结束。stdout
=xxxxx
您的HTML“响应”不是HTML。反斜杠太多。请使用专用工具分析HTML:xmllint--HTML--xpath'//h3[2]/text()'response.HTML
感谢您的输入。我是xmllint的新手,曾尝试按照建议解析xmllint的上述HTML响应(更新类似于确切的响应),但其结果是“HTML解析器错误放置标签”。请提出建议。这意味着您输入的HTML无效。如果无法确保有效输入,则必须遵循最初的想法,即使用某种基于正则表达式的解决方案来提取所需的数据。是的,通过调查发现,HTML似乎以字符串格式在列表中传递,这导致xmllint抛出错误。我试图用Python解析字符串,但有一个问题。我可以把它包括在这里吗?你可能应该为此提出一个新问题。