lxml:当HTML标签文本内容为None时附加'None'或空值
我想读取一个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
的情况下返回一个空字符串''