Python BS代码的lxml替代方案

Python BS代码的lxml替代方案,python,beautifulsoup,lxml,Python,Beautifulsoup,Lxml,我有以下代码: soup = BeautifulSoup(text) for elem in soup.find_all('span', 'finereader'): elem.replace_with(elem.string or '') 我想使用lxml,因为我不能利用BS产生的缩进。 是否有使用lxml的等效代码?或者如何可以省略BS的缩进 非常感谢您的帮助:) 编辑: BS产生如下输出: <html> <body> <table border

我有以下代码:

soup = BeautifulSoup(text)
for elem in soup.find_all('span', 'finereader'):
    elem.replace_with(elem.string or '')
我想使用lxml,因为我不能利用BS产生的缩进。 是否有使用lxml的等效代码?或者如何可以省略BS的缩进

非常感谢您的帮助:)

编辑: BS产生如下输出:

<html>
 <body>
  <table border="0" cellpadding="0" cellspacing="0" class="main" frame="box" rules="all" style="table-layout:fixed; width:324.72pt; height:518.64pt;">
   <tr class="row">
    <td class="cell" style=" width:0.00pt; height:0.00pt;" valign="top">
    </td>
    <td class="cell" style=" width:169.44pt; height:0.00pt;" valign="top">
    </td>
<html>
<body>
<table border="0" cellpadding="0" cellspacing="0" class="main" frame="box" rules="all" style="table-layout:fixed; width:324.72pt; height:518.64pt;">
<tr class="row">
<td class="cell" style=" width:0.00pt; height:0.00pt;" valign="top">
</td>
<td class="cell" style=" width:169.44pt; height:0.00pt;" valign="top">
</td>

要进行解析,请创建一个
lxml.etree.HTMLParser
并使用
lxml.etree.fromstring

import lxml.etree

parser = lxml.etree.HTMLParser()
html = lxml.etree.fromstring(text, parser)
现在可以使用xpath选择所需的内容:

for elem in html.xpath("//span[@class='finereader']"):
然后,由于lxml不允许您添加文本节点,而是处理节点的
text
tail
内容,因此我们必须使用字符串替换节点:

    text = (elem.text or "") + (elem.tail or "")
    if elem.getprevious() is not None: # If there's a previous node
        previous = elem.getprevious()
        previous.tail = (previous.tail or "") + text # append to its tail
    else:
        parent = elem.getparent() # Otherwise use the parent
        parent.text = (parent.text or "") + text # and append to its text
    elem.getparent().remove(elem)

然后,您可以使用
lxml.etree.tostring(html)
获取文本。

缩进是什么意思?你有什么问题?我指定了问题。如果我的答案有帮助,请告诉我。。。lxml有时会很挑剔。你的答案帮助很大,请参阅评论。非常感谢!:)非常感谢这段代码!它部分起作用。如果我正确地实现了代码,它将删除“”的所有外观。但不幸的是,如果我得到这样的东西:“text1…其他一些text2…”,上面的代码将返回以下内容:“text1…”。但我应该保留(直接附加)“其他文本2…”。这是怎么做到的?也许strip_tags()是一种可能?@MarkF6 Oops,我的代码中有一个输入错误,我忘了添加!现在试试看。另外,在
中是否会有任何标记?不,如果有,则只有字母或数字。我现在就试试。Maaan…我也应该看到打字错误:(代码可以使用95%:)。有一种特殊情况下,代码会遇到一些问题:如果我遇到类似这样的问题:“TEXT1 TEXT2LETTER1 TEXT3LETTER2 TEXT4”,代码将返回:“TEXT1 LETTER2 TEXT4”。我们如何处理这些案件?
    text = (elem.text or "") + (elem.tail or "")
    if elem.getprevious() is not None: # If there's a previous node
        previous = elem.getprevious()
        previous.tail = (previous.tail or "") + text # append to its tail
    else:
        parent = elem.getparent() # Otherwise use the parent
        parent.text = (parent.text or "") + text # and append to its text
    elem.getparent().remove(elem)