lxml:当HTML标签文本内容为None时附加'None'或空值

2 投票
1 回答
1283 浏览
提问于 2025-04-18 06:23

我想读取一个HTML内容,并用lxml提取最后一个表格的内容到一个数组里。

这是我的最后一个表格:

<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 个回答

2

你遇到的问题是,xpath中的text()是用来获取元素内容的,但对于某些p元素来说,它的内容是空的(None),所以这些元素的内容就无法被获取。

解决办法是修改xpath,让它选择所有的p元素,然后再从中获取文本内容。

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

如果有些元素没有p,可以考虑另一种方法(这个更新的请求是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的情况下返回一个空字符串''

撰写回答