【问题标题】:Regex with HTML tags and escaped characters带有 HTML 标签和转义字符的正则表达式
【发布时间】:2016-08-13 15:52:36
【问题描述】:

我有这段文字:

<h5 class="subblocksubhead subsubsectionhead first"><b>Messaggi inseriti</b></h5>
<dl class="blockrow stats">
    <dt><b>Messaggi inseriti</b></dt>
    <dd> 81</dd>
</dl>
<dl class="blockrow stats">
    <dt>Media dei messaggi giornalieri</dt>
    <dd> 0.02</dd>
</dl>

我正在尝试使用此代码提取" 81"

regex_message_sent_num=r'Messaggi inseriti<.+>\n\t\t<.+?>(\s.+)<.+?>'
pattern_message_sent_num=re.compile(regex_message_sent_num)
results_message_sent_num=re.findall(pattern_message_sent_num,html_text)

我总是得到一个空列表作为输出,而当我测试代码 here 时,我得到了正确的提取。

知道我做错了什么吗? HTML 来自一个网页,我试图从中提取一些可见数据作为练习。我在从 chrome 浏览器保存的 HTML 文本上测试了正则表达式。

【问题讨论】:

  • “知道我做错了什么吗?” - 是的!您正在尝试parse HTML with regex。使用实际的 HTML 解析器Beautiful Soup 或其他东西。
  • 感谢您的建议,我会使用您建议的工具。

标签: python html regex


【解决方案1】:

改用 HTML 解析器,例如 BeautifulSoup

使用文本搜索和find_next_sibling() method:

from bs4 import BeautifulSoup

data = """
<div>
    <dl class="blockrow stats">
        <dt><b>Messaggi inseriti</b></dt>
        <dd> 81</dd>
    </dl>
    <dl class="blockrow stats">
        <dt>Media dei messaggi giornalieri</dt>
        <dd> 0.02</dd>
    </dl>
</div>"""

soup = BeautifulSoup(data, "html.parser")

label = soup.find("dt", text="Messaggi inseriti")
print(label.find_next_sibling("dd").get_text(strip=True))

打印81

【讨论】:

  • 感谢您的建议,我将尝试按照您的答案示例编写新代码并使用 HTML 解析器 BeautifulSoup。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多