如何控制Python的re.findall()在HTML字符串上返回的结果?

2024-05-16 13:06:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图捕捉“catalina320”的所有实例,只要它们出现在“这些船”字符串之前(见下面的通用示例)。在

我有捕获“catalina320”的所有实例的代码,但是我不知道如何在“这些船”字符串处停止它。在

resultsArray = re.findall(r'<tag>(Catalina 320)</tag>', string, re.DOTALL)

有人能帮我解决这个丢失的部分吗?我试着加上“.+这些船”,但没用。在

谢谢- 法学博士

^{pr2}$

Tags: 实例字符串代码re示例stringtagfindall
3条回答

您可以使用正则表达式来解决这个问题,但根据您所说的问题,regex不是必需的,请参见尾注1。在

您应该使用^{}来解析这个。。。在

import lxml.etree as ET
from lxml.etree import XMLParser

resultsArray = []
parser = XMLParser(ns_clean=True, recover=True)
tree = ET.parse('foo.html', parser)   # See End-Note 2
for elem in tree.findall("//"):
    if "These boats" in elem.text:
        break
    elif "Catalina 320" in elem.text:
        resultsArray.append(ET.tostring(elem).strip())


print resultsArray

执行此操作将产生:

^{pr2}$


尾注:
  1. 您的问题的当前版本没有有效的标记,但我假设您有xml或html(这是您在问题的版本1中拥有的内容)。。。我的答案可以处理您编写的文本,但是假设某种类型的结构标记更有意义,因此我使用了以下输入文本,我将其保存为本地foo.html公司名称:

         <body>
    <tag>Blah blah blah</tag>
        <tag>**Catalina 320**</tag>
      <tag>Blah<tag>
        <td>**Catalina 320**</td>
      </tag>Blah Blah </tag>
        <tag>**These boats** are fully booked for the day</tag>
      <tag>Blah blah blah</tag>
        <tag>Catalina 320</tag>
        <tag>Catalina 320</tag>
        </body>
    
  2. 如果您想在编码问题上更小心一点,可以使用lxml.soupparser作为使用lxml

    解析HTML时的备用方法

from lxml.html import soupparser
# ...
try:
    parser = XMLParser(ns_clean=True, recover=True)
    tree = ET.parse('foo.html', parser)
except UnicodeDecodeError:
    tree = soupparser.parse('foo.html')

如果您的问题没有其他上下文,您可以在第一次出现'These boats'之前搜索:

re.findall('Catalina 320', string.split('These boats')[0])
groups = re.findall(r'(Catalina 320)*.*These boats, r.read(), re.DOTALL)

分组中的第一组将包含Catalina 320匹配项的列表。在

相关问题 更多 >