如何使用python从非结构化HTML中创建结构化数组

todd1215

好的,所以我有一个包含数据的HTML文件,其中包含许多div标签和表标签。div标签包含与其他div标签部分相关的ID,但是在每个div标签部分之后是一个表部分,其中包含我需要的数据。我希望能够获取此HTML文件并创建数组,列表,字典等……某种结构,以便我可以轻松地搜索相关信息并从中提取所需信息。

HTML文件中内容的示例。

<DIV class="info">      <A name="bc968f9fa2db71455f50e0c13ce50e871fS7f0e"
id="bc968f9fa2db71455f50e0c13ce50e871fS7f0e">
        <B>WORKSPACE_WEBAPP</B>&nbsp;(WORKSPACE_WEBAPP)<BR/>        <B>Object ID:
</B>&nbsp;&nbsp;bc968f9fa2db71455f50e0c13ce50e871fS7f0e<BR/>        <B>Last
Modified Date : </B>&nbsp;&nbsp;26-Sep-13 10:41:13<BR/>
        <B>Properties:</B><BR/>     </DIV>

    <TABLE class="properties">      <TR class="header"><TH>Property
Name</TH><TH>Property Value</TH></TR>
                    <TR><TD>serverName</TD><TD>FoundationServices0</TD></TR>
                    <TR><TD>context</TD><TD>workspace</TD></TR>
                    <TR><TD>isCompact</TD><TD>false</TD></TR>
                    <TR><TD>AppServer</TD><TD>WebLogic 10</TD></TR>
                    <TR><TD>port</TD><TD>28080</TD></TR>
                    <TR><TD>maintVersion</TD><TD>11.1.2.2.0.66</TD></TR>
                    <TR><TD>version</TD><TD>11.1.2.0</TD></TR>
                    <TR><TD>SSL_Port</TD><TD>28443</TD></TR>
                    <TR><TD>instance_home</TD><TD>/essdev1/app/oracle/Middleware/user_projects/epmsystem1</TD></TR>
                    <TR><TD>configureBPMUIStaticContent</TD><TD>true</TD></TR>
                    <TR><TD>validationContext</TD><TD>workspace/status</TD></TR>            </TABLE>

因此,我希望能够为这些div部分创建一个数组,并且还包含表中以及该数组内的区域的属性。我只是不能全神贯注于什么是最好的方法。我知道答案可能包含使用BeautifulSoup解析标签。既然没有其他方法可以将表部分与div部分相关联,我相信我必须一次加载一行文件并以这种方式进行处理,除非有更简单的方法?任何想法都将非常有帮助。

罗伯ᵩ

首先,我需要重申您的问题。该示例显示了一个div标签,其中包含一个A标签。A标签具有您要为以下表中查找要使用的密钥的ID。div标记后面一个table该表的每一行都包含一个与上一个中标识的对象相关联的名称-值对A

您的页面上充满了多个div标签,每个标签在我的上一段中都有介绍。

您想产生一些数据结构来方便地访问表数据并将其与命名对象相关联吗?

我有那个权利吗?

正如您所预言的,答案是使用BeautifulSoup。我们将创建一个字典,以id属性为字典中的每个值本身就是一个字典,由表中的“属性名称”作为键。

from bs4 import BeautifulSoup
from pprint import pprint

result = {}
soup = BeautifulSoup(page)
divs = soup.find_all("div", {"class":"info"})
for div in divs:
    name = div.find("a")["id"]
    table = div.find_next("table", {"class":"properties"})
    rows = table.find_all("tr", {"class":None})
    rowd = {}
    for row in rows:
        cells = row.find_all("td")
        rowd[cells[0].text] = cells[1].text
    result[name] = rowd
pprint (result)

或者,如果您更喜欢dict理解(就像我一样):

result = {
    div.find("a")["id"]: {
        cells[0].text : cells[1].text
        for row in table.find_all("tr", {"class":None})
        for cells in [row.find_all("td")]
    }
    for div in soup.find_all("div", {"class":"info"})
    for table in [div.find_next("table", {"class":"properties"})]
}

pprint(result)

当指向您的示例数据时,将产生:

{'bc968f9fa2db71455f50e0c13ce50e871fS7f0e': {u'AppServer': u'WebLogic 10',
                                             u'SSL_Port': u'28443',
                                             u'configureBPMUIStaticContent': u'true',
                                             u'context': u'workspace',
                                             u'instance_home': u'/essdev1/app/oracle/Middleware/user_projects/epmsystem1',
                                             u'isCompact': u'false',
                                             u'maintVersion': u'11.1.2.2.0.66',
                                             u'port': u'28080',
                                             u'serverName': u'FoundationServices0',
                                             u'validationContext': u'workspace/status',
                                             u'version': u'11.1.2.0'}}

要使用数据结构,只需遵循字典。例如:

print result["bc968f9fa2db71455f50e0c13ce50e871fS7f0e"]["serverName"]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章