Skip to content

Commit e05fcb3

Browse files
committed
move lxml stuff to parser class
1 parent 7f9d52e commit e05fcb3

4 files changed

Lines changed: 31 additions & 25 deletions

File tree

goose/cleaners.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ def clean_em_tags(self, doc):
7979
for node in ems:
8080
images = Parser.getElementsByTag(node, tag='img')
8181
if len(images) == 0:
82-
node.drop_tag()
82+
Parser.drop_tag(node)
8383
return doc
8484

8585
def remove_drop_caps(self, doc):
8686
items = Parser.css_select(doc, "span[class~=dropcap], span[class~=drop_cap]")
8787
for item in items:
88-
item.drop_tag()
88+
Parser.drop_tag(item)
8989

9090
return doc
9191

@@ -108,22 +108,18 @@ def remove_scripts_styles(self, doc):
108108
return doc
109109

110110
def clean_bad_tags(self, doc):
111-
112111
# ids
113-
naughty_list = doc.xpath(self.nauthy_ids_re,
114-
namespaces={'re': self.regexp_namespace})
112+
naughty_list = Parser.xpath_re(doc, self.nauthy_ids_re)
115113
for node in naughty_list:
116114
Parser.remove(node)
117115

118116
# class
119-
naughty_classes = doc.xpath(self.nauthy_classes_re,
120-
namespaces={'re': self.regexp_namespace})
117+
naughty_classes = Parser.xpath_re(doc, self.nauthy_classes_re)
121118
for node in naughty_classes:
122119
Parser.remove(node)
123120

124121
# name
125-
naughty_names = doc.xpath(self.nauthy_names_re,
126-
namespaces={'re': self.regexp_namespace})
122+
naughty_names = Parser.xpath_re(doc, self.nauthy_names_re)
127123
for node in naughty_names:
128124
Parser.remove(node)
129125

@@ -132,15 +128,15 @@ def clean_bad_tags(self, doc):
132128
def remove_nodes_regex(self, doc, pattern):
133129
for selector in ['id', 'class']:
134130
reg = "//*[re:test(@%s, '%s', 'i')]" % (selector, pattern)
135-
naughty_list = doc.xpath(reg, namespaces={'re': self.regexp_namespace})
131+
naughty_list = Parser.xpath_re(doc, reg)
136132
for node in naughty_list:
137133
Parser.remove(node)
138134
return doc
139135

140136
def clean_para_spans(self, doc):
141137
spans = Parser.css_select(doc, 'p > span')
142138
for item in spans:
143-
item.drop_tag()
139+
Parser.drop_tag(item)
144140
return doc
145141

146142
def get_flushed_buffer(self, replacement_text, doc):

goose/extractors.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def get_favicon(self, article):
131131
kwargs = {'tag': 'link', 'attr': 'rel', 'value': 'icon'}
132132
meta = Parser.getElementsByTag(article.doc, **kwargs)
133133
if meta:
134-
favicon = meta[0].attrib.get('href')
134+
favicon = Parser.getAttribute(meta[0], 'href')
135135
return favicon
136136
return ''
137137

@@ -169,7 +169,7 @@ def get_meta_content(self, doc, metaName):
169169
content = None
170170

171171
if meta is not None and len(meta) > 0:
172-
content = meta[0].attrib.get('content')
172+
content = Parser.getAttribute(meta[0], 'content')
173173

174174
if content:
175175
return content.strip()
@@ -196,7 +196,7 @@ def get_canonical_link(self, article):
196196
kwargs = {'tag': 'link', 'attr': 'rel', 'value': 'canonical'}
197197
meta = Parser.getElementsByTag(article.doc, **kwargs)
198198
if meta is not None and len(meta) > 0:
199-
href = meta[0].attrib.get('href')
199+
href = Parser.getAttribute(meta[0], 'href')
200200
if href:
201201
href = href.strip()
202202
o = urlparse(href)
@@ -277,10 +277,10 @@ def calculate_best_node(self, article):
277277
# parent node
278278
parent_node = Parser.getParent(node)
279279
self.update_score(parent_node, upscore)
280-
self.update_node_count(node.getparent(), 1)
280+
self.update_node_count(parent_node, 1)
281281

282-
if node.getparent() not in parent_nodes:
283-
parent_nodes.append(node.getparent())
282+
if parent_node not in parent_nodes:
283+
parent_nodes.append(parent_node)
284284

285285
# parentparent node
286286
parent_parent_node = Parser.getParent(parent_node)
@@ -414,24 +414,24 @@ def update_score(self, node, addToScore):
414414
we're passing in to the current
415415
"""
416416
current_score = 0
417-
score_string = node.attrib.get('gravityScore')
417+
score_string = Parser.getAttribute(node, 'gravityScore')
418418
if score_string:
419419
current_score = int(score_string)
420420

421421
new_score = current_score + addToScore
422-
node.set("gravityScore", str(new_score))
422+
Parser.setAttribute(node, "gravityScore", str(new_score))
423423

424424
def update_node_count(self, node, add_to_count):
425425
"""\
426426
stores how many decent nodes are under a parent node
427427
"""
428428
current_score = 0
429-
count_string = node.attrib.get('gravityNodes')
429+
count_string = Parser.getAttribute(node, 'gravityNodes')
430430
if count_string:
431431
current_score = int(count_string)
432432

433433
new_score = current_score + add_to_count
434-
node.set("gravityNodes", str(new_score))
434+
Parser.setAttribute(node, "gravityNodes", str(new_score))
435435

436436
def is_highlink_density(self, e):
437437
"""\
@@ -468,7 +468,7 @@ def get_score(self, node):
468468
return self.get_node_gravity_score(node) or 0
469469

470470
def get_node_gravity_score(self, node):
471-
grvScoreString = node.attrib.get('gravityScore')
471+
grvScoreString = Parser.getAttribute(node, 'gravityScore')
472472
if not grvScoreString:
473473
return None
474474
return int(grvScoreString)

goose/outputformatters.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def remove_negativescores_nodes(self):
7979
"""
8080
gravity_items = Parser.css_select(self.top_node, "*[gravityScore]")
8181
for item in gravity_items:
82-
score = int(item.attrib.get('gravityScore'), 0)
82+
score = Parser.getAttribute(item, 'gravityScore')
83+
score = int(score, 0)
8384
if score < 1:
8485
item.getparent().remove(item)
8586

goose/parsers.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,19 @@
2929

3030
class Parser(object):
3131

32+
@classmethod
33+
def xpath_re(self, node, expression):
34+
regexp_namespace = "http://exslt.org/regular-expressions"
35+
items = node.xpath(expression, namespaces={'re': regexp_namespace})
36+
return items
37+
3238
@classmethod
3339
def drop_tag(self, nodes):
34-
for node in nodes:
35-
node.drop_tag()
40+
if isinstance(nodes, list):
41+
for node in nodes:
42+
node.drop_tag()
43+
else:
44+
nodes.drop_tag()
3645

3746
@classmethod
3847
def css_select(self, node, selector):

0 commit comments

Comments
 (0)