【问题标题】:How to get the text from a cell after <br/> tag?如何从 <br/> 标签后的单元格中获取文本?
【发布时间】:2016-01-21 17:50:15
【问题描述】:

我正在爬取一个简单但很长的 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标签内没有任何东西。我已将异常设置为仅通过并打印出任何内容。在同一个 try-except 中,我尝试了也打印出尾部,但由于之前发生的异常,从未打印出尾部。

【问题讨论】:

    标签: python html parsing xpath lxml


    【解决方案1】:

    对我来说,下面正在努力提取br之后的所有文本-

    normalize-space(//table//br/following::text()[1])
    

    工作示例是 at

    【讨论】:

      【解决方案2】:

      因为&lt;br/&gt;是一个自闭合标签,它没有任何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
      

      【讨论】:

      • 嗯,现在我也意识到 html 代码并不一致。一些 br 标签是自动关闭的,但其中一些是打开的。正确的标签适用于尾部,但如果 br 标签保持打开状态,则尾部无法打印其后的内容。
      • 你是如何解析内容的?如果将上面的示例定义为变量content,将&lt;br/&gt; 标记更改为开始标记&lt;br&gt; 并使用解析器root = lxml.etree.html(content)tail 仍会产生内容。
      • 我取出了漂亮的 html etree 打印件,似乎在所有打开的 'br' 标记之后都有一个 回车符。这会导致问题吗?
      • 我会将此标记为答案。寻找尾巴实际上有所帮助,尽管实际问题出在我令人尴尬的错误中。测试时我对我的代码不是很小心:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      相关资源
      最近更新 更多