尝试使用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)
答案 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
个案例中会返回空字符串''