(self, tree: html.HtmlElement, nodes_to_keep: list[str])
| 349 | return list(nodes_to_keep) |
| 350 | |
| 351 | def prune(self, tree: html.HtmlElement, nodes_to_keep: list[str]) -> html.HtmlElement: |
| 352 | # remove nodes not in nodes_to_keep |
| 353 | for node in tree.xpath('//*')[::-1]: |
| 354 | if node.tag != 'text': |
| 355 | is_keep = node.attrib.get(self.id_attr, '') in nodes_to_keep |
| 356 | is_candidate = node.attrib.get(self.id_attr, '') in self.keep |
| 357 | else: |
| 358 | is_keep = (node.getparent().attrib.get(self.id_attr, '') in nodes_to_keep) |
| 359 | is_candidate = (node.getparent().attrib.get(self.id_attr, '') in self.keep) |
| 360 | |
| 361 | if not is_keep and node.getparent() is not None: |
| 362 | # insert all children into parent |
| 363 | for child in node.getchildren(): |
| 364 | node.addprevious(child) |
| 365 | node.getparent().remove(node) |
| 366 | else: |
| 367 | # if not is_candidate or node.tag == 'text': |
| 368 | # node.attrib.pop(self.id_attr, None) |
| 369 | if ( |
| 370 | len(node.attrib) == 0 |
| 371 | and not any([x.tag == 'text' for x in node.getchildren()]) |
| 372 | and node.getparent() is not None |
| 373 | and node.tag != "text" |
| 374 | and len(node.getchildren()) <= 1 |
| 375 | ): |
| 376 | # insert all children into parent |
| 377 | for child in node.getchildren(): |
| 378 | node.addprevious(child) |
| 379 | node.getparent().remove(node) |
| 380 | |
| 381 | return tree |
| 382 | |
| 383 | def prune_tree(self, dfs_count: int=1, max_depth: int=3, max_children: int=30, |
| 384 | max_sibling: int=3, keep_parent: bool=False) -> None: |
no outgoing calls
no test coverage detected