lxml:当html标签文本内容为None时,附加“None”或Null值

时间:2014-05-13 08:03:41

标签: python google-app-engine lxml

尝试使用lxml读取html内容并将最后一个表的内容提取到数组中。

这是我的最后一张表:

<table border="1">
        <thead>
            <tr>
                <td><p>T1</p></td>
                <td><p>T2</p></td>
                <td><p>T3</p></td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><p>A1</p></td>
                <td><p></p></td>
                <td><p>A3</p></td>
            </tr>
        </tbody>
    </table>

当我运行以下代码时,eol_table值为['T1', 'T2', 'T3', 'A1', 'A3']。当None内容为空时,它未显示<p>或空白值。

预期值为['T1', 'T2', 'T3', 'A1', '', 'A3']。我怎样才能得到这样的结果?

代码:

eol_html_content =  urlfetch.fetch("https://dl.dropboxusercontent.com/u/7384181/Test.html").content

import lxml.html as LH
html_root = LH.fromstring(eol_html_content)

eol_table = None
for tbl in html_root.xpath('//table'):
   eol_table = tbl.xpath('.//tr/td/p/text()')

self.response.out.write(eol_table)

1 个答案:

答案 0 :(得分:2)

您的问题的根源是,xpath中的text()是要检索的元素的测试的一部分,而对于某些p元素,它是无,它不会被检索。

解决方案是修改xpath以选择所有p元素,然后从中获取text

import lxml.html as LH

xmlstr = """
<table border="1">
    <thead>
        <tr>
            <td><p>T1</p></td>
            <td><p>T2</p></td>
            <td><p>T3</p></td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><p>A1</p></td>
            <td><p></p></td>
            <td><p>A3</p></td>
        </tr>
    </tbody>
</table>
"""

html_root = LH.fromstring(xmlstr)

eol_table = None
for tbl in html_root.xpath('//table'):
     p_elements = tbl.xpath('.//tr/td/p')
     eol_table = [p_elm.text for p_elm in p_elements]

     print eol_table

打印:

['T1', 'T2', 'T3', 'A1', None, 'A3']

替代案例,其中某些元素没有

(这是Nijo提出的更新请求,他也带来了text_content()电话)

xmlstr = """
<table border="1">
    <thead>
        <tr>
            <td><p>T1</p></td>
            <td><p>T2</p></td>
            <td><p>T3</p></td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><p>A1</p></td>
            <td><p></p></td>
            <td></td>
        </tr>
    </tbody>
</table>
"""
html_root = LH.fromstring(xmlstr)

eol_table = None
for tbl in html_root.xpath('//table'):
    td_elements = tbl.xpath('.//tr/td')
    eol_table = [td_elm.text_content() for td_elm in td_elements]
    print eol_table

打印什么

['T1', 'T2', 'T3', 'A1', '', '']

如您所见,text_content()永远不会返回None,但在None个案例中会返回空字符串''