python - 如何从 <br/> 标签后的单元格中获取文本?

标签 python html parsing xpath lxml

我正在爬取一个简单但很长的 HTML block ,它与此类似:

<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 中,我也尝试打印出尾部,但从未打印出尾部,因为在它之前发生了异常。

最佳答案

因为 <br/>是一个自闭合标签,它没有任何 text内容。相反,您需要访问它的 tail内容。 tail content 是元素的结束标记之后但在下一个开始标记之前的内容。要在 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

关于python - 如何从 <br/> 标签后的单元格中获取文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33281217/

相关文章:

Python "call()"函数不接受从 "abspath()"到文件的路径

python - 部分 HTML 对 Scrapy 不可见

javascript - 如何查找 JSON 中某个值是否存在

c - (新手) strstr() 返回带有无符号参数的 null

java - 如何解析 WSDL 文件以提取特定节点的内容

python - Beautiful Soup - 从 HTML 文件中取出类

python - 具有自由和固定参数的函数的 Scipy basin hopping 最小化

html - <hr> 每三个 <div> 下面

javascript - 使用 <a href> 提交 POST 表单的最简单的跨浏览器方式是什么?

python - 如何限制beautifulsoup中select标签的结果?