从html表解析结果

时间:2013-01-12 10:44:43

标签: python xpath lxml

我试图匹配html输出中的一些数据,但我不知道我能做些什么来正确执行它。因此,我使用以下代码块来提取访问内容和组信息:

import requests
import lxml.etree as LE
import lxml.html as LH

url = "http://theurl"
r = requests.get(url,auth=('user', 'pass'))
html = r.text

root = LH.fromstring(html)
LE.strip_tags(root, 'b')
data_list = root.xpath("""//td[text()='grouplist']
                             /following-sibling::*""")[0]

accessList= data_list.xpath("""//td[text()='access']
                                 /following-sibling::*/text()""")

groups = data_list.xpath("""//td[text()='groups']
                                 /following-sibling::*/text()""")

如果我打印accessList,我有我想要的数据:

print accessList
['Administrators', 'group_a', 'group_b', 'group_c']

但是当我打印组时,返回的结果将是:

print groups:
['\n','\n','\n']

有了这些信息,可以做些什么来获得:

print groups
['group_a', 'group_b', 'group_c']

在这里,您可以看到返回的html结果

<TABLE bgcolor="#dddddd" border="1" />
<TR>
   <TD valign="top"><B>grouplist</B></TD>
   <TD>
      <TABLE />
<TR>
   <TD>
      <TABLE bgcolor="#dddddd" border="1" />
<TR>
   <TD valign="top"><B>access</B></TD>
   <TD>Administrators</TD>
</TR>
<TR>
   <TD valign="top"><B>inUse</B></TD>
   <TD>true</TD>
</TR>
<TR>
   <TD valign="top"><B>groups</B></TD>
   <TD>
      <TABLE>
         <TR>
            <TD>group_a</TD>
         </TR>
         <TR>
            <TD>group_b</TD>
         </TR>
         <TR>
            <TD>group_c</TD>
         </TR>
      </TABLE>
   </TD>
</TR>
<TR>
   <TD valign="top"><B>deny</B></TD>
   <TD>
      <TABLE>
      </TABLE>
   </TD>
</TR>

编辑:可以在此处测试Html代码: html tester

提前致谢。

1 个答案:

答案 0 :(得分:1)

groups = data_list.xpath("""//td[text()='groups']
                                 /following-sibling::td/table/tr/td/text()""")

或者,具体而言,

groups = data_list.xpath("""//td[text()='groups']
                                 /following-sibling::*//td/text()""")

的工作原理。如果这对您的目的来说太具体了,您可以这样定义groups

groups = data_list.xpath("""//td[text()='groups']
                                 /following-sibling::*""")[0]

然后使用text_content

groups = groups.text_content().split()

但是,如果将group_agroup_b和/或group_c替换为本身包含空格的文本,则在空格上拆分文本内容可能效果不佳。