【问题标题】:Custom HTMLParser with regex not returning correctly带有正则表达式的自定义 HTMLParser 未正确返回
【发布时间】:2019-02-22 21:36:00
【问题描述】:

我正在开发一个程序,该程序根据不同的正则表达式从 HTML 文件中抓取一些信息。我遇到了以下代码的错误

我的 HTMLParser 子类:

class MyHtmlParser(HTMLParser):
    def __init__(self):
        self.reset()
        self.title = []
    def handle_data(self, d):
        Result = re.search(r'ANMELDELSE .*(?=</b>)',d)
        if Result:
            self.title.append(Result.group(0))
    def return_data(self):
        return self.title

运行代码:

with open(r'....', "r") as f: #correct path to local test.html
    page = f.read()
parser.feed(page)
parser.return_data()

现在 HTML 文件真的很乱,而且是挪威语,但这里有一个应该触发它的子集

<p style="margin: 0cm 0cm 0pt;"><span style="text-decoration: underline;">Sak 428/18-123, 03.09.2018 </span></p>
<p style="margin: 0cm 0cm 0pt;"><b>&nbsp;</b></p>
<p style="margin: 0cm 0cm 0pt;"><b>ANMELDELSE FOR TRAKASSERING</b></p>

这应该选择“ANMELDELSE FOR TRAKASSERING”,它在https://regex101.com/https://regexr.com/ 中都可以,但是在执行代码时,我得到的只是一个空列表。该代码已与以前的正则表达式调用一起使用,所以我有点迷茫。

希望有人能帮忙!

【问题讨论】:

  • 如果我在这里使用正则表达式,我会使用接近r'ANMELDELSE[^&lt;&gt;]* 的东西。你确定那里的空间不是不间断的空间吗?
  • 调用handle_data(self, d)时传入的是什么对象d
  • 这真的帮助了@WiktorStribiżew!你介意澄清你所说的不间断空间是什么意思吗?当我尝试过的两个网站都给了我正确的答案时,我感到非常困惑..
  • 它是一个\u00A0 char,非常类似于常规空格。
  • 大概就是这样,现在看来可以了!谢谢@WiktorStribiżew!

标签: regex python-2.7 html-parsing


【解决方案1】:

您的文本仅在某些文本节点中具有ANMELDELSE,您可以使用它来获取它

r'ANMELDELSE[^<>]*'

您的原始模式包含文字常规空格 (\x20)。而不是那个空格,non-breaking space 通常用于确保下一个单词在文本编辑器/查看器中保持在同一行。

要匹配它,您可以使用 \s 并将 re.U 修饰符(在使用 Python 2.7 时需要)传递给您的 re.search 方法,但由于您想匹配到标签的末尾,只需使用否定字符类[^&lt;&gt;]*,除&lt;&gt; 之外的任何0+ 字符。

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多