lxml: добавить значение None или NULL, если текстовое содержимое HTML-тега равно 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 ответ
Корень вашей проблемы в том, что text()
в вашем xpath является частью теста для элементов, чтобы получить и, как это None для некоторых 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']
Альтернатива для случая, когда некоторый элемент не имеет
(этот обновленный запрос спросил Нидзё, и он также пришел с 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
случаях возвращает пустую строку ''