from bs4 import BeautifulSoup
|
|
|
|
from .selector import Selector
|
|
|
|
|
|
class Schema(object):
|
|
__version__ = 1
|
|
|
|
@classmethod
|
|
def _get_selectors(cls):
|
|
for name, value in cls.__dict__.items():
|
|
if isinstance(value, Selector):
|
|
yield name, value
|
|
|
|
@classmethod
|
|
def parse(cls, html):
|
|
instance = cls()
|
|
soup = BeautifulSoup(html, 'html.parser')
|
|
for name, value in cls._get_selectors():
|
|
setattr(instance, name, value.resolve(soup))
|
|
return instance
|
|
|
|
def __repr__(self):
|
|
properties = []
|
|
for name, _ in self.__class__._get_selectors():
|
|
value = getattr(self, name, None)
|
|
properties.append('{name}={value}'.format(name=name, value=value))
|
|
return (
|
|
'{name}({properties})'
|
|
.format(name=self.__class__.__name__, properties=', '.join(properties))
|
|
)
|