1- import re
1+ """
22
3+ This module is used to create a LinkNode that can be consumued by a LinkTree
4+ and contains useful Link methods
5+
6+ """
37import requests
48import requests .exceptions
59import validators
610
711from bs4 import BeautifulSoup
12+ from .utils import multi_thread
813from .color import color
914
15+ def get_emails (node ):
16+ """Finds all emails associated with node
17+
18+ Args:
19+ node (LinkNode): node used to get emails from
20+ Returns:
21+ emails (list): list of emails
22+ """
23+ emails = []
24+ for child in node .children :
25+ link = child .get ('href' )
26+ if link and 'mailto' in link :
27+ email_addr = link .split (':' )
28+ if LinkNode .valid_email (email_addr [1 ]) and len (email_addr ) > 1 :
29+ emails .append (email_addr [1 ])
30+ return emails
31+
32+
33+ def get_links (node ):
34+ """Finds all links associated with node
35+
36+ Args:
37+ node (LinkNode): node used to get links from
38+ Returns:
39+ links (list): list of links
40+ """
41+ def retrieve_link (child ):
42+ link = child .get ('href' )
43+ if link and LinkNode .valid_link (link ):
44+ return link
45+ return None
46+
47+ return multi_thread (node .children , retrieve_link )
48+
49+
1050class LinkNode :
51+ """Represents link node in a link tree
52+
53+ Attributes:
54+ link (str): link to be used as node
55+ """
1156
12- def __init__ (self , link , * , tld = False ):
57+ def __init__ (self , link ):
58+ # If link has invalid form, throw an error
1359 if not self .valid_link (link ):
1460 raise ValueError ("Invalid link format." )
1561
16- self .tld = tld
1762 self ._children = []
1863 self ._emails = []
64+ self ._links = []
1965
66+ # Attempts to connect to link, throws an error if link is unreachable
2067 try :
2168 self .response = requests .get (link )
22- except (requests .exceptions .ChunkedEncodingError , requests .exceptions .HTTPError , requests .exceptions .ConnectionError , ConnectionError ) as err :
69+ except (requests .exceptions .ChunkedEncodingError ,
70+ requests .exceptions .HTTPError ,
71+ requests .exceptions .ConnectionError ,
72+ ConnectionError ) as err :
2373 raise err
2474
2575 self ._node = BeautifulSoup (self .response .text , 'html.parser' )
@@ -30,43 +80,43 @@ def __init__(self, link, *, tld=False):
3080 self .name = self ._node .title .string
3181 self .status = color (link , 'green' )
3282
33- def get_emails (self ):
34- if self ._emails :
35- return self ._emails
36-
37- children = self ._node .find_all ('a' )
38- email_nodes = []
39- for child in children :
40- link = child .get ('href' )
41- if link and 'mailto' in link :
42- email_addr = link .split (':' )
43- if self .valid_email (email_addr [1 ]) and len (email_addr ) > 1 :
44- email_nodes .append (email_addr [1 ])
45- self ._emails = email_nodes
46- return email_nodes
47-
48- def get_children (self ):
49- if self ._children :
50- return self ._children
51-
52- children = self ._node .find_all ('a' )
53- child_nodes = []
54- for child in children :
55- link = child .get ('href' )
56- if link and self .valid_link (link ):
57- child_nodes .append (link )
58-
59- self ._children = child_nodes
60- return child_nodes
83+ @property
84+ def emails (self ):
85+ """
86+ Getter for node emails
87+ """
88+ if not self ._emails :
89+ self ._emails = get_emails (self )
90+ return self ._emails
91+
92+ @property
93+ def links (self ):
94+ """
95+ Getter for node links
96+ """
97+ if not self ._links :
98+ self ._links = get_links (self )
99+ return self ._links
100+
101+ @property
102+ def children (self ):
103+ """
104+ Getter for node children
105+ """
106+ if not self ._children :
107+ self ._children = self ._node .find_all ('a' )
108+ return self ._children
61109
62110 @staticmethod
63111 def valid_email (email ):
64- if validators .email (email ):
65- return True
66- return False
112+ """Static method used to validate emails"""
113+ if validators .email (email ):
114+ return True
115+ return False
67116
68117 @staticmethod
69118 def valid_link (link ):
119+ """Static method used to validate links"""
70120 if validators .url (link ):
71121 return True
72122 return False
0 commit comments