提取i和br标记中的信息并保存在字典中

2024-10-01 17:38:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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标记之前的信息。有谁能建议一种方法来提取信息并将其保存为字典中的键值对。例如

^{pr2}$

Tags: 标记brdiv信息字典stylehtml页面
3条回答

为什么不使用regex来实现这一点,您不需要解析实际的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转换为浮点数等,则可能需要进行额外的后处理。对于通用解决方案,您可能希望尝试将每个值转换为您可以接受的值:

^{pr2}$

工作原理:很简单,它在<i><br/>标记之间搜索两个匹配的组—一个紧跟在它后面,允许空白,另一个在</i>后面,允许空白。所有这样的匹配都被捕获,并使用第一个捕获的组作为键,第二个作为新的dict的值进行循环。在

查看以下方法:

from bs4 import BeautifulSoup as Soup

html = """<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>"""

soup = Soup(html, 'html.parser')

obj = dict()
for i in soup.find_all('i'):
    key = str(i.get_text()).strip(' :')
    value = i.next_sibling
    if isinstance(value, NavigableString): # Check this because Point has not value.
        obj[key] = str(value).strip()
print(obj)

注意,该点没有任何值,因此需要检查下一个同级是否为字符串。在

有关详细信息,请查看.next_sibling and .previous_sibling,以及如何使用BeautifulGroup导航tags和{}。在

仅在BeautifulSoup的帮助下打印以下内容:

^{pr2}$

你可以先^{}中的“br”标记,然后使用^{}方法检索i标记,然后使用^{}获取该标记后面的文本。在

In [81]: from bs4 import BeautifulSoup as BS

In [82]: html = """<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>"""

In [83]: soup = BS(html, "html.parser")

In [84]: for br in soup.select(".rbody > br"):
    ...:     br.decompose()
    ...:     

In [85]: {i.get_text(strip=True).replace(":", ""): i.next_sibling.strip() for i in soup.select(".rbody > i")}
Out[85]: 
{'Point': '',
 'X': '1.5778346701624997E7',
 'Y': '-3861557.6243750006',
 'objectid': '137000',
 'poialtlabel': '',
 'poigroup': 'Hydrography',
 'poilabel': 'FOUR CORNERS DAM',
 'poilabeltype': 'NAMED',
 'poiname': 'FOUR CORNERS DAM',
 'poitype': 'Manmade Waterbody',
 'topoid': '504514394'}

相关问题 更多 >

    热门问题