2015-04-23 54 views
1

好吧,我有这个HTML文件,其中包含许多div标签和表标签。 div标签包含与其他div标签部分相关的id,但在每个div标签部分之后是包含我需要的数据的表格部分。我希望能够获取这个HTML文件并创建数组,列表,字典等...某种结构,以便我可以轻松搜索相关信息并从中提取我需要的信息。如何使用python从非结构化的HTML中创建结构化阵列

HTML文件中whats的示例。

<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部分关联起来,我相信我必须一次加载一行文件并以此方式处理文件,除非有更简单的方法?任何想法都会非常有帮助。

+1

你看了一下[在Python中解析HTML](http://stackoverflow.com/questions/11709079/parsing-html-python)? – Huey

+0

是的,我读过这个和许多其他的python HTML解析指南。我想我最大的问题是如何控制阅读div标签部分,然后阅读它的关联表部分,然后移动到下一个div标签部分和表部分,直到整个文件被解析。 – todd1215

+1

您可以在阅读后删除div标签,然后查找下一个标签,直到找不到更多标签为止? – Huey

回答

1

首先,我要重申你的问题。该示例显示了一个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) 

或者,如果你喜欢字典内涵(像我一样):

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

很优雅。这正是我想要做的。你对我的解释重新陈述是现货。 – todd1215

+0

这行看起来不正确。我得到一个错误。 name = div.find(“a”)[“id”] – todd1215

2

使用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 :