lxml未按预期检测到空div

时间:2016-07-30 11:33:13

标签: python lxml

对于以下输入,lxml会修改div,就好像它知道div不能在p内。

有人能告诉我如何获得<div></div>这种输入吗?我想纠正输入HTML。

我是否需要切换到BeautifulSoup

from lxml import etree

html_string = """
<html>
<head>
  <title></title>
</head>
<body>
  <p align="center">
  <div></div>
  This line should be centered.
  </p>
  <table>
    <tbody>
      <tr>
       <td>
         <div></div>
       </td>
      </tr>
    </tbody>
  </table>
</body>
</html>
"""

html_element = etree.fromstring(html_string)

page_break_elements = html_element.xpath("//div")

(Pdb) etree.tostring(html_element[1][0][0])
b'<div/>\n  This line should be centered.\n  '

我只想让下面的元素移动它。

<div></div>

对于任何好奇的人来说,这些是用于指定分页符的PDF生成div的分页符<div style="page-break-after:always"></div>。我收到来自TinyMCE的输入,它没有正确定位,因此我试图将其移动到body元素。

所需的输出

from lxml import etree

html_string = """
<html>
<head>
  <title></title>
</head>
<body>
  <div></div>
  <p align="center">
  This line should be centered.
  </p>
  <div></div>
  <table>
    <tbody>
      <tr>
       <td>
       </td>
      </tr>
    </tbody>
  </table>
</body>
</html>
"""

2 个答案:

答案 0 :(得分:1)

您可以使用 lxml 中的soupparser并仍然使用xpath等处理数据..:

from lxml.html.soupparser import fromstring

html_element = fromstring(html_string)

这将在{。

中保持<div></div>

答案 1 :(得分:0)

您需要传递一些额外的参数来更改tostring()的行为:

etree.tostring(d, method="html", with_tail=False)
'<div></div>'