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

2024-09-29 22:19:08 发布

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

好的,我有一个HTML文件,其中包含许多div标记和table标记。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节关联起来,我认为我必须一次加载一行文件并以这种方式处理它,除非有更简单的方法?任何想法都会很有帮助。你知道吗


Tags: 文件标记brdividhtml数组workspace
2条回答

首先,我需要重申你的问题。该示例显示了一个div标记,其中包含一个A标记。A标记有一个ID,您想用它作为查找下表的键。div标记后面跟着一个table。表的每一行都包含一个与前面A中标识的对象相关联的名称-值对。你知道吗

您有一个充满了多个div标记的页面,我的上一段描述了每个标记。你知道吗

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

我有这个权利吗?你知道吗

答案,正如你所预言的,是使用美丽之声。我们将创建一个由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)

或者,如果你喜欢听写理解(就像我一样):

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"]

使用BeautifulSoup

基本的解决方法是使用连接美化分割。基本思想是把它转换成一个文本,并把兴趣部分分开

from bs4 import BeautifulSoup
soup = BeautifulSoup(''.join(text))
for i in soup.prettify().split('<! Persontype >')[1].split('<strong>'):
print '<strong>' + ''.join(i)



text= '''
<div class="clearfix">
    <! # of ppl associated with place >
        This is some kind of buzzword:<br />
    <br />
    <! Persontype >
        <strong>Hey</strong> All            <br />
Something  text here            <br />
About Something
        <br />
Mobile Version        <br />
        <br />
        <strong>MObile</strong> Nokia            <br />
Try to implement here            <br />
Simple
            <br />
hey Thanks       <br />


O/P is :

相关问题 更多 >

    热门问题