Пользовательский HTMLParser с регулярным выражением не возвращается правильно - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над программой, которая собирает некоторую информацию из 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/,, но когдапосле выполнения кода все, что я напечатал, это пустой список.Код работал с предыдущими вызовами регулярных выражений, поэтому я немного растерялся.

Надеюсь, что кто-то может помочь!

1 Ответ

0 голосов
/ 18 сентября 2018

Если ваш текст имеет ANMELDELSE только в некотором текстовом узле, вы можете получить его, используя

r'ANMELDELSE[^<>]*'

Ваш оригинальный шаблон содержит буквальное регулярное пространство (\x20).Вместо этого пробела часто используется неразрывный пробел , чтобы убедиться, что следующее слово остается в той же строке в текстовых редакторах / средствах просмотра.

Чтобы соответствовать ему, вы можете использовать \s и передайте модификатор re.U (это необходимо, так как вы используете Python 2.7) в свой метод re.search, но, так как вы хотите соответствовать до конца тега, просто используйте отрицательный класс символов [^<>]*,любые 0+ символов кроме < и >.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...