我有 HTML 页面,我需要在其中提取 i 标签和 br 标签中的信息并将其保存在字典中,如下所示,
<div class="rbody">
<div style="color:#ff6666"> </div>
<i>objectid: </i> 137000<br/>
<i>topoid: </i> 504514394<br/>
<i>poigroup: </i> Hydrography<br/>
<i>poitype: </i> Manmade Waterbody<br/>
<i>poiname: </i> FOUR CORNERS DAM<br/>
<i>poilabel: </i> FOUR CORNERS DAM<br/>
<i>poilabeltype: </i> NAMED<br/>
<i>poialtlabel: </i> <br/>
<i>Point:</i><br/>
<i>X: </i> 1.5778346701624997E7 <br/>
<i>Y: </i> -3861557.6243750006 <br/>
<br/><br/>
</div>
我可以使用类 rbody 提取 div 标签中存在的文本。即使我能够提取 i 标签之间的内容,但不能提取 br 标签之前的信息。任何人都可以提出一种方法来提取信息并将其保存为字典中的键值对。例如
dictionary = {'objectid': 137000, 'topoid': 504514394, 'poigroup': 'Hydrography', 'poitype':'Manmade Waterbody', 'poiname' : 'FOUR CORNERS DAM', 'X':1.5778346701624997E7, 'y':-3861557.6243750006}
为什么不为此使用正则表达式,您不需要解析实际的 HTML(除非您还需要位置信息):
import re
data = """
<div class="rbody">
<div style="color:#ff6666"> </div>
<i>objectid: </i> 137000<br/>
<i>topoid: </i> 504514394<br/>
<i>poigroup: </i> Hydrography<br/>
<i>poitype: </i> Manmade Waterbody<br/>
<i>poiname: </i> FOUR CORNERS DAM<br/>
<i>poilabel: </i> FOUR CORNERS DAM<br/>
<i>poilabeltype: </i> NAMED<br/>
<i>poialtlabel: </i> <br/>
<i>Point:</i><br/>
<i>X: </i> 1.5778346701624997E7 <br/>
<i>Y: </i> -3861557.6243750006 <br/>
<br/><br/>
</div>
"""
parsed = dict(element for element in re.findall(r"<i>\s*(.*?):.*?</i>\s*(.*?)\s*<br/>", data))
print(parsed)
# {'poigroup': 'Hydrography', 'objectid': '137000', 'topoid': '504514394', 'poilabeltype': 'NAMED', 'X': '1.5778346701624997E7', 'Point': '', 'poialtlabel': '', 'poitype': 'Manmade Waterbody', 'poiname': 'FOUR CORNERS DAM', 'poilabel': 'FOUR CORNERS DAM', 'Y': '-3861557.6243750006'}
如果您希望将 X 和 Y 转换为浮点数等,您可能需要进行额外的后处理。对于通用解决方案,您可能希望尝试将每个值转换为您可以接受的内容:
def conv(pair):
if len(pair) < 2 or not pair[1]:
return pair[0], None
try:
return pair[0], int(pair[1])
except ValueError:
try:
return pair[0], float(pair[1])
except ValueError:
return pair
parsed = dict(conv(element) for element in re.findall(r"<i>\s*(.*?):.*?</i>\s*(.*?)\s*<br/>", data))
print(parsed)
# {'X': 15778346.701624997, 'Y': -3861557.6243750006, 'objectid': 137000, 'poilabeltype': 'NAMED', 'poialtlabel': None, 'poiname': 'FOUR CORNERS DAM', 'poitype': 'Manmade Waterbody', 'Point': None, 'poilabel': 'FOUR CORNERS DAM', 'topoid': 504514394, 'poigroup': 'Hydrography'}
它是如何工作的:简单,它在<i>
和<br/>
标签之间搜索两个匹配组 - 一个紧跟在它之后,允许空格,一个在它之后</i>
再次允许空格。所有这样的匹配都被捕获,并使用第一个捕获的组作为键和第二个作为新的值循环dict
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句