Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions llm_web_kit/main_html_parser/parser/tag_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,28 @@
raise TagMappingParserException(e)
return pre_data

def parse_single(self, pre_data: PreDataJson) -> PreDataJson:
"""
skip element dict construct step, remove all non-main tags in template tagged html directly
for single-html extraction plan
Args:
pre_root:
Returns:
PreDataJson: 包含映射结果的PreDataJson对象
"""
try:
template_tag_html = pre_data[PreDataJsonKey.TYPICAL_RAW_TAG_HTML]
response_json = pre_data[PreDataJsonKey.LLM_RESPONSE]
root = html.fromstring(template_tag_html)
# 直接抽取正文
content_list = self.tag_main_html(response_json, root)
template_extract_html = self.__extract_main_directly(root)
pre_data[PreDataJsonKey.TYPICAL_MAIN_HTML] = template_extract_html
pre_data[PreDataJsonKey.HTML_TARGET_LIST] = content_list
except Exception as e:
raise TagMappingParserException(e)

Check warning on line 94 in llm_web_kit/main_html_parser/parser/tag_mapping.py

View check run for this annotation

Codecov / codecov/patch

llm_web_kit/main_html_parser/parser/tag_mapping.py#L93-L94

Added lines #L93 - L94 were not covered by tests
return pre_data

def __get_max_width_layer(self, element_dict):
max_length = 0
max_width_layer = 0
Expand Down Expand Up @@ -139,6 +161,34 @@
parent.set('magic_main_html', 'True')
cur = parent

def __extract_main_directly(self, pre_root):
def iter_process(elem):
if isinstance(elem, etree._Comment):
return
magic_main_html = elem.get('magic_main_html', None)
if magic_main_html:
# 查找所有子孙节点中 magic_main_html='True' 的元素
matching_elements = elem.xpath(
'.//*[@magic_main_html="True"]'
)
# 给正文最小单元节点的子孙节点补上正文标识,避免被删除
if len(matching_elements) == 0:
for child in elem.iterdescendants(): # 仅遍历子孙节点(不包括自身)
child.set('magic_main_html', 'True')
else:
# 非正文节点直接删除
parent = elem.getparent()
if parent is None:
return

Check warning on line 182 in llm_web_kit/main_html_parser/parser/tag_mapping.py

View check run for this annotation

Codecov / codecov/patch

llm_web_kit/main_html_parser/parser/tag_mapping.py#L182

Added line #L182 was not covered by tests
parent.remove(elem)
for elem_child in elem:
iter_process(elem_child)

if pre_root is None:
return None

Check warning on line 188 in llm_web_kit/main_html_parser/parser/tag_mapping.py

View check run for this annotation

Codecov / codecov/patch

llm_web_kit/main_html_parser/parser/tag_mapping.py#L188

Added line #L188 was not covered by tests
iter_process(pre_root)
return html.tostring(pre_root, encoding='utf-8').decode()

def tag_main_html(self, response, pre_root):
content_list = []
for elem in pre_root.iter():
Expand Down
15 changes: 15 additions & 0 deletions tests/llm_web_kit/main_html_parser/processor/test_tag_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,18 @@ def test_construct_main_tree_fail_by_similarity(self):
pre_data = parser.parse(pre_data)
construct_success = pre_data.get(PreDataJsonKey.TYPICAL_MAIN_HTML_SUCCESS)
self.assertEqual(False, construct_success)

def test_parse_single(self):
data = []
raw_html_path = base_dir.joinpath('assets/test_tag_mapping_web.jsonl')
with open(raw_html_path, 'r', encoding='utf-8') as f:
for line in f:
data.append(json.loads(line.strip())) # 解析每行 JSON
mock_dict = data[0]
pre_data = PreDataJson(mock_dict['pre_data'])
pre_data[PreDataJsonKey.TYPICAL_RAW_HTML] = pre_data[PreDataJsonKey.TYPICAL_RAW_TAG_HTML]
parser = MapItemToHtmlTagsParser({})
pre_data = parser.parse_single(pre_data)
content_list = pre_data[PreDataJsonKey.HTML_TARGET_LIST]
self.assertEqual(content_list, mock_dict['expected_content_list'])
self.assertEqual(len(pre_data['typical_main_html']), 2269)