解析带有封闭标签的 HTML table (lxml, XPath)

Parsing HTML table (lxml, XPath) with enclosed tags

任务是解析大 HTML tables,所以我将 lxml 与 XPath 查询一起使用。有时 table 单元格可以包含封闭的标签(例如 SPAN)

<html>
  <table>
    <tr>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <td><span>3</span></td>
      <td>4</td>
    </tr>
  </table>
</html>

而且我不知道如何以正确的方式处理它。 我的Python代码

from lxml import etree
from io import StringIO

html_text = '<html><table><tr><td>1</td><td>2</td></tr><tr><td><span>3</span></td><td>4</td></tr></table></html>'

parser = etree.HTMLParser()
tree = etree.parse(StringIO(html_text), parser)
rows = tree.xpath('//tr')

for row in rows:
    row_values = []
    for cell in row:
        row_values.append(cell.text)
    print(row_values)

生成

['1', '2']
[None, '4']

请问如何正确处理这类问题(封装标签)? 据我推测,我必须获得 TD 的最后 child 或以某种方式设置解析器。

使用cell.xpath('string()')代替cell.text来简单地读出每个单元格的字符串值。