diff --git a/llm_web_kit/main_html_parser/parser/layout_batch_parser.py b/llm_web_kit/main_html_parser/parser/layout_batch_parser.py
index 13d198ee..ce76ef70 100644
--- a/llm_web_kit/main_html_parser/parser/layout_batch_parser.py
+++ b/llm_web_kit/main_html_parser/parser/layout_batch_parser.py
@@ -3,6 +3,7 @@
from hashlib import sha256
import nltk
+from bs4 import BeautifulSoup
from lxml import html
from lxml.html import etree
from nltk.tokenize import word_tokenize
@@ -29,6 +30,7 @@ def __init__(self, template_data: str | dict):
self.dynamic_classid_enable = False
self.more_noise_enable = False
self.dynamic_classid_similarity_threshold = 0.85
+ self.ids = dict()
def parse_tuple_key(self, key_str):
if key_str.startswith('(') and key_str.endswith(')'):
@@ -41,6 +43,8 @@ def parse_tuple_key(self, key_str):
def parse(self, pre_data: PreDataJson) -> PreDataJson:
# 支持输入字符串和tag mapping后的dict对象
html_source = pre_data[PreDataJsonKey.HTML_SOURCE]
+ soup = BeautifulSoup(html_source, 'html.parser')
+ html_source = str(soup)
template_dict_html = pre_data.get(PreDataJsonKey.TYPICAL_DICT_HTML, '')
self.dynamic_id_enable = pre_data.get(PreDataJsonKey.DYNAMIC_ID_ENABLE, False)
self.dynamic_classid_enable = pre_data.get(PreDataJsonKey.DYNAMIC_CLASSID_ENABLE, False)
@@ -112,13 +116,19 @@ def normalize_key(self, tup):
tag, class_id, idd = tup
if class_id:
class_id = re.sub(r' +', ' ', class_id)
+
if idd:
+ valid_id = self.ids.get(idd, True)
idd = re.sub(r' +', ' ', idd)
+
# 如果有id,则无需判断class,因为有的网页和模版id相同,但是class不同
if tag in ['body', 'html']:
return (tag, None, None)
- if idd:
- return (tag, None, self.replace_post_number(idd))
+
+ if idd and valid_id:
+ idd_norm = self.replace_post_number(idd)
+ return (tag, None, idd_norm)
+
return (tag, self.replace_post_number(class_id), self.replace_post_number(idd))
def replace_post_number(self, text):
@@ -129,7 +139,7 @@ def replace_post_number(self, text):
# 使用 \1 保留前面的 "post" 或 "postid",但替换数字部分
return re.sub(pattern, lambda m: f'{m.group(1)}-', text, flags=re.IGNORECASE).strip()
- def find_blocks_drop(self, element, depth, element_dict, parent_keyy, parent_label, template_doc):
+ def find_blocks_drop(self, element, depth, element_dict, parent_keyy, parent_label, template_doc, tree):
# 判断这个tag是否有id
if isinstance(element, etree._Comment):
return
@@ -144,8 +154,16 @@ def find_blocks_drop(self, element, depth, element_dict, parent_keyy, parent_lab
layer_nodes = element_dict[depth]
class_tag = element.get('class')
ori_keyy = (tag, class_tag, idd)
+ if idd and idd.strip():
+ try:
+ idd_ele = tree.xpath(f'//*[@id="{idd}"]')
+ if len(idd_ele) > 3:
+ self.ids[idd] = False
+ else:
+ self.ids[idd] = True
+ except Exception:
+ self.ids[idd] = True
keyy = self.normalize_key(ori_keyy)
-
# 获取element的当前层的所有节点
element_parent = element.getparent()
current_layer_keys = {}
@@ -167,6 +185,16 @@ def find_blocks_drop(self, element, depth, element_dict, parent_keyy, parent_lab
layer_norm_eles = {}
# 构造当前层的候选映射字典
for ele_keyy, ele_value in layer_nodes.items():
+ layer_node_idd = ele_keyy[2]
+ if layer_node_idd and layer_node_idd.strip() and layer_node_idd not in self.ids:
+ try:
+ idd_ele = template_doc.xpath(f'//*[@id="{layer_node_idd}"]')
+ if len(idd_ele) > 3:
+ self.ids[layer_node_idd] = False
+ else:
+ self.ids[layer_node_idd] = self.ids.get(layer_node_idd, True)
+ except Exception:
+ self.ids[layer_node_idd] = self.ids.get(layer_node_idd, True)
ele_parent_keyy = self.normalize_key(ele_value[1])
if ele_parent_keyy is not None:
ele_parent_keyy = tuple(ele_parent_keyy)
@@ -267,13 +295,13 @@ def find_blocks_drop(self, element, depth, element_dict, parent_keyy, parent_lab
return
for child in element:
- self.find_blocks_drop(child, depth + 1, element_dict, keyy, label, template_doc)
+ self.find_blocks_drop(child, depth + 1, element_dict, keyy, label, template_doc, tree)
def drop_node_element(self, html_source, element_dict, template_dict_html):
# 解析 HTML 内容
tree = html_to_element(html_source)
doc = html_to_element(template_dict_html)
- self.find_blocks_drop(tree, 0, element_dict, None, '', doc)
+ self.find_blocks_drop(tree, 0, element_dict, None, '', doc, tree)
return element_to_html(tree)
def htmll_to_content2(self, body_str):
@@ -408,7 +436,7 @@ def __match_tag(self, layer_nodes, current_layer_key, parent_key, node_html, tem
return None, None, None
- def __is_natural_language(self, text, min_words=3):
+ def __is_natural_language(self, text, min_words=10):
"""判断文本是否像自然语言.
:param text: 输入文本
@@ -417,7 +445,4 @@ def __is_natural_language(self, text, min_words=3):
"""
# 移除标点符号和多余空格
cleaned_text = re.sub(r'[^\w\s]', '', text.strip())
- words = cleaned_text.split()
- if len(words) <= min_words:
- return False
- return True
+ return len(cleaned_text) >= min_words
diff --git a/llm_web_kit/main_html_parser/parser/tag_mapping.py b/llm_web_kit/main_html_parser/parser/tag_mapping.py
index d633da40..c635615d 100644
--- a/llm_web_kit/main_html_parser/parser/tag_mapping.py
+++ b/llm_web_kit/main_html_parser/parser/tag_mapping.py
@@ -1,3 +1,4 @@
+from bs4 import BeautifulSoup
from lxml import etree, html
from llm_web_kit.exception.exception import TagMappingParserException
@@ -31,6 +32,8 @@ def parse(self, pre_data: PreDataJson) -> PreDataJson:
# tag映射逻辑
try:
template_raw_html = pre_data[PreDataJsonKey.TYPICAL_RAW_HTML]
+ soup = BeautifulSoup(template_raw_html, 'html.parser')
+ template_raw_html = str(soup)
template_tag_html = pre_data[PreDataJsonKey.TYPICAL_RAW_TAG_HTML]
response_json = pre_data[PreDataJsonKey.LLM_RESPONSE]
root = html.fromstring(template_tag_html)
diff --git a/tests/llm_web_kit/main_html_parser/parser/assets/input_layout_batch_parser/test_all_ids.html b/tests/llm_web_kit/main_html_parser/parser/assets/input_layout_batch_parser/test_all_ids.html
new file mode 100644
index 00000000..4bcc4cb1
--- /dev/null
+++ b/tests/llm_web_kit/main_html_parser/parser/assets/input_layout_batch_parser/test_all_ids.html
@@ -0,0 +1,192 @@
+
+
+
+
+H型钢的利用率是什么_公司新闻_H型钢_H型钢价格_热轧H型钢_焊接H型钢_高频焊接H型钢-天津郎丰达金属制品有限公司
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
聯系我們
+
+
+ -
+
服務熱線
+
+
+ 聯系人:李經理
電話:022-85103518
手機:13612183033
+
+
+
+
+
+
+
+
H型鋼的利用率是什么
+
+ 瀏覽:167 發布日期:2019-04-25 11:42:00
+
+
H型鋼在進行操作時主要是指以熱軋或者是冷軋帶鋼為原料,在常溫的狀態下經壓力加工制成的各種復雜斷面型材,亦稱薄壁型鋼,是輕型建筑結構鋼材的一種。H型鋼是以熱軋或冷軋帶鋼為坯料經彎曲成型制成的各種截面形狀尺寸的型鋼。
H型鋼具有以下特點
缅甸银河国际网址 1。
+截面經濟合理,節省材料,其H型鋼的截面形狀是可以根據需要設計,結構合理,單位重量的截面系數高于熱軋型鋼。在同樣負荷下,可減輕構件重量,節約材料。H型鋼用于建筑結構可比熱軋型鋼節約金屬38%~50%,用于農業機械和車輛可節約金屬15%~60%。方便施工,降低綜合費用。
2. H型鋼的品種繁多,在進行操作時可以生產用一般熱軋方法難以生產的壁厚均勻、截面形狀復雜的各種型材和各種不同材質的H型鋼。

3。產品表面光潔,外觀好,尺寸精確,而且長度也可以根據需要靈活調整,全部按定尺或倍尺供應,提高材料的利用率。
缅甸银河国际网址 4.生產中還可與沖孔等工序相配合,以滿足不同的需要。
H型鋼主要是采用其普通的碳素結構鋼以及優質的碳素結構鋼、低合金結構鋼板或鋼帶冷彎制成。H型鋼是屬于經濟斷面鋼材,也是高效節能材料,是一種具有強大生命力的新型鋼材品種,它廣泛應用于國家經濟的各個領域,其用途大約可以分為公路護欄板、鋼結構、汽車、集裝箱、鋼模板和腳手架、鐵道車輛、船舶和橋梁、鋼板樁、輸電鐵塔、其他10大類。
+
+
上一篇:
+
+
+ H型鋼的特點分析
+
+
+
下一篇:
+
+
+ H型鋼的結構及除銹問題
+
+
+
+
+
+
+
+
+
+
+