您的报价不匹配。'text-info'仔细注意示例字符串和"text-info"编译的正则表达式之间的区别。IIRC 在原始字符串中转义引号在 Python 中有点痛苦(如果可能的话?),但字符串连接可以轻松地回避这个问题。
area = re.compile(r'</span></li><li>(\d+)<span class='"'"'text-info'"'"'>Área Útil')
关注引号,这是连接字符串'...class', "'", 'text-info', "'", 和'>.... 那里的规则是,如果您想'在单引号原始字符串中添加单引号,则改为编写'"'"'并尝试忽略图灵在他的坟墓中转身。我没有测试过性能,但我认为它的行为可能很像'...class' + "'" + 'text-info' + "'" + '>.... 如果是这种情况,则会在幕后发生大量复制,并且该策略在连接的片段数量上具有二次运行时间(假设它们的大小大致相同,否则通常适合这种分析)。使用几乎任何其他策略(例如''.join(...)或使用三引号原始字符串)都会更好r'''...''')。不过,这可能不是问题。在搞乱替代方案之前,对您的解决方案进行基准测试,看看它是否足够好。
正如提到的评论之一,您可能希望使用比正则表达式更强大的东西来解析 HTML。正则表达式无法正确解析任意HTML,因为它无法解析任意嵌套结构。有很多库可以使工作更轻松,并为您处理所有括号匹配和字符串处理,以便您可以专注于对所需数据的高级描述。我是lxml. 如果不花大量时间,类似下面的内容将大致相当于您正在做的事情。
from lxml import html
with open("body2.txt", 'r') as f:
tree = html.fromstring(f.read())
area = tree.xpath("//li[contains(span/text(), 'Área Útil')]/text()")
print(area)
该html.fromstring()方法将您的数据解析为 html。该tree.xpath方法使用xpath语法来查询该解析树。粗略地说,它的意思如下:
//在树下任意远
li一个列表节点
[*]满足方括号中的任何属性
contains(span/text(), 'Área Útil')该li节点需要有一个span/text()包含文本的节点'Área Útil'
/text()li我们想要任何作为我们正在描述的根的直接子级的文本。
我在这里处理少量的文本,一般情况下不知道您的文档结构是什么。您可以添加或更改任何这些属性,以更好地描述您正在解析的确切文档。当你检查一个元素时,任何现代浏览器都能够生成一个像样的 xpath 表达式来准确地挑选出你正在检查的元素。假设这个片段来自一个更大的文档,我想这个功能会为你节省时间。