如何在标签后从单元格中获取文本?

时间:2015-10-22 12:36:35

标签: python html parsing xpath lxml

我正在浏览一个简单但很长的HTML块,类似于:

<table>
  <tbody>
    <tr>
      <td> Some text </td>
      <td> Some text </td>
    </tr>
    <tr>
      <td> Some text 
        <br/>
           Some more text
      </td>
    </tr>
  </tbody>
</table>

我正在使用以下小python代码(使用lxml)收集数据:

for element in root.iter():
  if element == 'td': 
    print element.text

有些文本分为两行,但大多数都是一行。问题出在分开的行中。

根元素是'table'标记。那个小代码可以打印出所有其他文本,但不会打印出'br'标签之后的内容。如果我不排除非td标签,代码会尝试从'br'标签内部打印可能的文本,但当然没有任何内容,因此这只会打印出空的新行。

然而,在这个'br'之后,代码移动到迭代中行的下一个标记,但忽略了仍然在前一个'td'标记内的数据。

如何在这些标签之后获取数据?

编辑:似乎有些'br'标签是自动关闭的,但有些是开放的

<td> 
     Some text
  <br>
     Some more text
</td>

第一个答案中建议的element.tail方法似乎无法在该开放标记之后获取数据。

Edit2:实际上它有效。是我自己的错误。忘记提到“print element.text”部分是由try-except封装的,在br标签的情况下捕获了一个AttributeError,因为br标签内部没有任何内容。我把例外设置为只传递并打印出来。在同一个尝试中 - 除了我尝试也打印出尾部,但从未打印出尾部,因为它之前发生的异常。

2 个答案:

答案 0 :(得分:4)

由于<br/>是自动关闭标记,因此它没有任何text内容。相反,您需要访问它的tail内容。 tail内容是元素结束标记之后但在下一个开始标记之前的内容。要在for循环中访问此内容,您需要使用以下内容:

for element in root.iter():
    element_text = element.text
    element_tail = element.tail

即使br标记是开始标记,此方法仍然有效:

from lxml import etree

content = '''
<table>
  <tbody>
    <tr>
      <td> Some text </td>
      <td> Some text </td>
    </tr>
    <tr>
      <td> Some text 
        <br>
           Some more text
      </td>
    </tr>
  </tbody>
</table>
'''

root = etree.HTML(content)

for element in root.iter():
    print(element.tail)

<强>输出

Some more text

答案 1 :(得分:1)

以下是我正在努力提取[] -

之后的所有文字
br

工作示例 at