Python 正则表达式匹配多行html文本中的块

Python 正则表达式匹配多行html文本中的块,python,regex,python-3.x,python-2.7,Python,Regex,Python 3.x,Python 2.7,我有几个html文件,其中包含一段代码的两种不同模式,其中只有name=“horizon”是常量。我需要获取名为“value”的属性的值。下面是示例文件:- 文件1: 数据 管理员用户 远程管理员 文件2: <othertag some_att="asfa"> data </othertag> <select id="realm_17" size="1" name="horizon"> <option id="option_LoginPage_

我有几个html文件,其中包含一段代码的两种不同模式,其中只有
name=“horizon”
是常量。我需要获取名为“value”的属性的值。下面是示例文件:-
文件1:

数据
管理员用户
远程管理员
文件2:

<othertag some_att="asfa"> data
</othertag>
<select id="realm_17" size="1" name="horizon">
    <option id="option_LoginPage_1" value="Admin Users">Admin Users</option>
    <option id="option_LoginPage_1" value="Global-User">Global-User</option>
</select>
数据
管理员用户
全球用户
由于这些文件将具有其他标记和属性,因此我尝试通过引用使用这些正则表达式从文件中筛选所需内容来编写正则表达式

regex='^(?:.*?)(<(?P<TAG>\w+).+name\=\"horizon\"(?:.*[\n|\r\n?]*)+?<\/(?P=TAG>)'

regex='^(?:*?)(我完全同意@ZiTAL的说法,将文件解析为XML会更快更好

几行简单的代码可以解决您的问题:

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

# If you prefer to parse the text directly do root = ET.fromstring('<root>example</root>')

values = [el.attrib['value'] for el in root.findall('.//option')]

print(values)
将xml.etree.ElementTree作为ET导入
tree=ET.parse('file.xml')
root=tree.getroot()
#如果希望直接解析文本,请执行root=ET.fromstring('示例')
values=[el.attrib['value']表示root.findall('.//选项')中的el
打印(值)

我完全同意@ZiTAL的说法,将文件解析为XML会更快更好

几行简单的代码可以解决您的问题:

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

# If you prefer to parse the text directly do root = ET.fromstring('<root>example</root>')

values = [el.attrib['value'] for el in root.findall('.//option')]

print(values)
将xml.etree.ElementTree作为ET导入
tree=ET.parse('file.xml')
root=tree.getroot()
#如果希望直接解析文本,请执行root=ET.fromstring('示例')
values=[el.attrib['value']表示root.findall('.//选项')中的el
打印(值)
试试这个正则表达式

value="(.*)">
这是一个简单的正则表达式,用于从html文件中提取值。 此正则表达式显示在“value=”和“>之前的双引号之间提取任何内容

我还附上了输出的截图

试试这个正则表达式

value="(.*)">
这是一个简单的正则表达式,用于从html文件中提取值。 此正则表达式显示在“value=”和“>之前的双引号之间提取任何内容

我还附上了输出的截图


我尝试了@kazbeel解释的
xml.etree.ElementTree
模块,但它给了我“不匹配标记”的错误,我发现大多数情况下都是这样。然后我找到了这个模块并使用了它,它给出了期望的结果。下面的代码介绍了另一个文件模式以及问题中的上述模式。
文件3:


我同意@ZiTAL在解析xml/html文件时不使用正则表达式,因为它太复杂了,而且有很多可用的正则表达式。

我尝试了@kazbeel解释的
xml.etree.ElementTree
模块,但它给了我“不匹配的标记”错误,我发现大多数情况下都是这样。然后我找到了这个模块并使用了它,它给出了期望的结果。下面的代码介绍了另一个文件模式以及问题中的上述模式。
文件3:


我同意@ZiTAL在解析xml/html文件时不使用正则表达式,因为它太复杂了,而且有很多规则可供使用。

为什么不使用dom解析xml/html?@ZiTAL我从请求中获取html文本。get(url),所以我想正则表达式是否会更简单、更清晰。只有当由于某种原因无法通过DOM解析XML/HTML时,才可以通过正则表达式解析XML/HTML。如果可以使用DOM,请使用DOM,因为它更简单、更安全。为什么不使用DOM解析XML/HTML?@ZiTAL我从请求中获取HTML文本。get(url),所以我想正则表达式是否更简单、更清晰。只有当由于某种原因无法通过DOM解析XML/HTML时,才可以通过正则表达式解析XML/HTML,如果可以使用DOM,就使用DOM,因为它更简单、更安全。感谢@kazbeel,我尝试了XML.etree中的ElementTree,但它给出了一个错误“不匹配的标记”在我所有的文件和文本上。经过进一步的研究,我找到了BeautifulSoup模块并使用了它,这给了我完美的结果。很高兴听到你找到了解决问题的方法!继续学习,继续成长!谢谢@kazbeel我尝试了xml.etree中的ElementTree,但它给出了一个错误“不匹配的标记”在我所有的文件和文本上。经过进一步的研究,我找到了BeautifulSoup模块并使用了它,这给了我完美的结果。很高兴听到你找到了解决问题的方法!继续学习,继续成长!事实上,属性值中有很多标签,但我需要属性值“value”在标签下有'name=“horizon”“。所以这一个不是直截了当的。感谢回复@Muhammad Usman实际上有很多标签都有属性值,但我需要标签下的“value”属性值,它有'name=“horizon”“。所以这一个不是直截了当的。感谢回复@Muhammad Usman
from bs4 import BeautifulSoup ## module for parsing xml/html files
def get_realms(html_text):
    realms=[]
    soup=BeautifulSoup(html_text, 'lxml')
    in_tag=soup.find(attrs={"name":"horizon"})
    if in_tag.name == 'select':
        for tag in in_tag.find_all():
            realms.append(tag.attrs['value'])
    elif in_tag.name == 'input':
        realms.append(in_tag.attrs['value'])
    return realms