Regex работает с онлайн-тестером, а не с BeautifulSoup HTML - PullRequest
0 голосов
/ 12 октября 2019

Сводка

Я создаю регулярное выражение для анализа веб-сайта, содержащего данные о ссылках для загрузки Android Studio . Как видите, данные представляются регулярно, поэтому я хотел использовать регулярное выражение, чтобы сделать это за один раз.

Я сделал снимок html-данных и создал следующий регулярное выражение . Это именно то, что я хочу. На самом деле это сработало лучше, чем я думал!

Вот скриншот того, что он делает. Откройте изображение, чтобы увидеть его лучше. Опять же, здесь есть веб-страница для этого регулярного выражения.

enter image description here

Проблема заключается в том, что я кодифицировал ее в Python. Я не получаю спичек. Я даже использовал generated код Python, который веб-сайт предоставляет мне с моим регулярным выражением и текстом. Это работает! Однако, как только я перехожу из поддельного HTML-текста в реальные HTML-данные, мой код не выполняется. Это простое изменение в 1 строку, и я перехожу от работы к нулю.

Существующая работа

Сначала я использовал автоматически сгенерированный код , предоставленный онлайн-тестером.

Я взял следующий код (внизу) ...

matches = re.finditer(regex, test_str, re.MULTILINE)

и изменил его на ...

matches = re.finditer(regex, soup.text, re.MULTILINE)

Я также пытался soup.contents и str(soup.text). Я использовал PrettyPrint (pprint) для форматирования строки, чтобы убедиться, что в ней есть переводы строки. Ничего не работаетВсе это терпит неудачу

Код

Вот фрагмент автоматически сгенерированного кода по ссылке выше.

Примечание: Этот код работает, но как только язамените test_str html-строкой BeautifulSoup, тогда ничего не получится.

    import re

    regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(.*)</a>.*\((.*) bytes\))"

    test_str = ("<div class=\"all-downloads hide\">\n"
        "<section class=\"expandable\">\n"

        ...

        )

    matches = re.finditer(regex, test_str, re.MULTILINE)

    for matchNum, match in enumerate(matches, start=1):

        # Ignore the following
        print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

        for groupNum in range(0, len(match.groups())):
            groupNum = groupNum + 1

            print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

Я даже пытался сделать более простую версию, не основанную на автоматически сгенерированном коде

    regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(?P<filename>.*)</a>.*\((.*) bytes\))"

    # html_text = pprint.pformat(html.text)
    html_text = soup.text    # BeautifulSoup Object's text representation

    matches = re.findall(regex, html_text, re.M)

    print(matches)

Вывод

Я всегда получаю пустой список [], когда я использую html-строку объекта BeautifulSoup. Всегда.

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