带有正则表达式的自定义 HTMLParser 未正确返回

Custom HTMLParser with regex not returning correctly

提问人:BenMyr 提问时间:9/19/2018 更新时间:9/19/2018 访问量:31

问:

我正在开发一个程序,该程序根据不同的正则表达式从 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/ 中都如此,但是在执行代码时,我得到的只是一个空列表。该代码已与以前的正则表达式调用一起使用,所以我有点迷茫。

希望有人能帮忙!

正则表达式 python-2.7 html 解析

评论

0赞 Wiktor Stribiżew 9/19/2018
如果我在这里使用正则表达式,我会使用接近 .你确定那里的空间不是一个不间断的空间吗?r'ANMELDELSE[^<>]*
0赞 Ruzihm 9/19/2018
调用时传入什么样的对象?dhandle_data(self, d)
0赞 BenMyr 9/19/2018
这真的帮助@WiktorStribiżew!你介意澄清一下你所说的不间断空格是什么意思吗?当我尝试的两个网站都给了我正确的答案时,我感到非常困惑。
1赞 Wiktor Stribiżew 9/19/2018
它是一个 \u00A0 字符,与常规空格非常相似。
0赞 BenMyr 9/19/2018
大概就是这样,现在看来可以工作了!谢谢@WiktorStribiżew!

答:

1赞 Wiktor Stribiżew 9/19/2018 #1

假设您的文本仅在某个文本节点中,您可以使用ANMELDELSE

r'ANMELDELSE[^<>]*'

原始模式包含文本正则空格 ()。通常使用不间断空格来代替该空格,以确保下一个单词在文本编辑器/查看器中保持在同一行上。\x20

为了匹配它,您可以使用修饰符并将其传递给您的方法(这是必需的,因为您使用的是 Python 2.7),但由于您想匹配到标签的末尾,因此只需使用否定字符类,除 和 之外的任何 0+ 字符。\sre.Ure.search[^<>]*<>