AttributeError: у объекта 'NoneType' нет атрибута 'groups' в Regex - PullRequest
0 голосов
/ 15 января 2019

Я написал регулярное выражение для очистки данных с веб-страницы. Однако я получаю упомянутую ошибку. Я не могу найти решение для этого. Кто-то предложил

try:
    code
except:
     Attribute error

Оригинальный код:

import urllib.request
import bs4
import re

url ='https://ipinfo.io/AS7018'
def url_to_soup(url):
    req = urllib.request.Request(url)
    opener = urllib.request.build_opener()
    html = opener.open(req)
    soup = bs4.BeautifulSoup(html, "html.parser")
    return soup


s = str(url_to_soup(url))
#print(s)
asn_code, name = re.search(r'<h3 class="font-semibold m-0 t-xs-24">(?P<ASN_CODE>AS\d+) (?P<NAME>[\w.\s]+)</h3>', s)\
        .groups() # Error code
print(asn_code)
""" This is where the error : From above code """
country = re.search(r'.*href="/countries.*">(?P<COUNTRY>.*)?</a>',s).group("COUNTRY")
print(country)
registry = re.search(r'Registry.*?pb-md-1">(?P<REGISTRY>.*?)</p>',s, re.S).group("REGISTRY").strip()
print(registry)
# flag re.S make the '.' special character match any character at all, including a newline;
ip = re.search(r'IP Addresses.*?pb-md-1">(?P<IP>.*?)</p>',s, re.S).group("IP").strip()
print(ip)

Ответы [ 2 ]

0 голосов
/ 15 января 2019

re.search возвращает None, когда ничего не удается найти. None не отвечает на метод .groups(). Проверьте, существует ли совпадение или нет, прежде чем тщательно проверять совпадение.

match = re.search(r'<h3 class="font-semibold m-0 t-xs-24">(?P<ASN_CODE>AS\d+) (?P<NAME>[\w.\s]+)</h3>', s)
if match:
    asn_code, name = match.groups()

Однако, поскольку вы используете Beautiful Soup, зачем использовать stringify, а затем регулярное выражение? Это все равно что купить пакетик супа быстрого приготовления, добавить порошок в воду, вскипятить вещь, а затем обезвожить ее обратно в порошок . Зачем тогда использовать BeautifulSoup?

soup.select('h3.font-semibold.m-0.t-xs-24')[0].content

даст вам содержимое этого элемента <h3>; затем примените регулярное выражение к , что , если вам нужно. Регулярное выражение в документах HTML обычно плохая идея .

РЕДАКТИРОВАТЬ : Что именно дает вам TypeError? Это типичная XY проблема , когда вы решаете не то, что нужно. Я проверил это на работу, без TypeError (Python 3):

ast_re = re.compile(r'(?P<ASN_CODE>AS\d+) (?P<NAME>[\w.\s]+)')
soup = url_to_soup(url)
ast_h3 = next(
    (m for m in (ast_re.match(h3.text) for h3 in soup.select('h3')) if m),
    None)
if ast_h3:
    asn_code, name = asn_h3.groups()
0 голосов
/ 15 января 2019

утверждение:

re.search(r'<h3 class="font-semibold m-0 t-xs-24">(?P<ASN_CODE>AS\d+) (?P<NAME>[\w.\s]+)</h3>', s)

возвращает None искомый шаблон не найден в строке s.

Согласно документации для re.search

Просматривать строку в поисках первого места, где шаблон регулярного выражения создает совпадение, и возвращать соответствующий экземпляр MatchObject. Вернуть Нет , если ни одна позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.

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

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