使用Jinja过滤器对数据进行Ansible HTML解析和grep

使用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',

实际上,我正在尝试使用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', '<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解析字符串,但有一个问题。我可以把它包括在这里吗?你可能应该为此提出一个新问题。