Удалить несоответствующий закрывающий тег из HTML - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть html, хранящийся в строке.HTML-код недействителен и содержит непревзойденное закрытие </span> внутри <td>, т. Е.

<table>
  <tr><td>
    <p>First section of text.</p>
    <p>Second section of text.</span></p>
    <table>
      <tr><td>
        <p>Third section of text.</p>
      </td></tr>
    </table>
  </td></tr>
</table>

<p>Fourth section of text.</p>

. Я хочу использовать BeautifulSoup для изменения HTML-кода при загрузке этого HTML-кода в BS и извлечении в виде строки, используя:

soup = BeautifulSoup(html, 'html.parser')
print( str( soup.prettify() ) )

BS значительно изменила структуру.

<table>
 <tr>
  <td>
   <p>
    First section of text.
   </p>
   <p>
    Second section of text.
   </p>
  </td>
 </tr>
</table>
<table>
 <tr>
  <td>
   <p>
    Third section of text.
   </p>
  </td>
 </tr>
</table>
<p>
 Fourth section of text.
</p>

Без непревзойденного </span> выхода BS, как я и ожидал,

<table>
 <tr>
  <td>
   <p>
    First section of text.
   </p>
   <p>
    Second section of text.
   </p>
   <table>
    <tr>
     <td>
      <p>
       Third section of text.
      </p>
     </td>
    </tr>
   </table>
  </td>
 </tr>
</table>
<p>
 Fourth section of text.
</p>

Что бы я хотелкак сделать, это удалить непревзойденный из HTML.Как я могу сделать это без написания собственного парсера, который ищет непревзойденные теги?Я надеялся, что смогу использовать BS для очистки кода, но он не работает.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Я нашел возможное решение.Используйте html.parser для обнаружения потерянных конечных тегов, а затем удалите их из html перед загрузкой в ​​BeautifulSoup.

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)
        self.taghash={}
        self.fixups = []

    def handle_starttag(self, tag, attrs):
        if not tag in self.taghash:
            self.taghash[tag]=1
        self.taghash[tag] = self.taghash[tag] + 1

    def handle_endtag(self, tag):
        if not tag in self.taghash:
            self.taghash[tag]=0
        self.taghash[tag] = self.taghash[tag] - 1
        if self.taghash[tag] < 0:
            print( "No unclosed starttag.", tag, self.getpos())
            self.fixups.append( (tag,self.getpos()))
    parser = MyHTMLParser()
    parser.feed(html)
    data = html.splitlines()
    parser.fixups.reverse()
    for fixup in parser.fixups:
        line = fixup[1][0]-1
        offset = fixup[1][1]
        m = re.search( "</\s*%s.?>"%fixup[0],data[line][offset:])
        data[line] = data[line][:offset]+data[line][offset+m.end():]
    html = "".join(data)
0 голосов
/ 08 апреля 2019

Вы можете разделить его с помощью <span> и затем присоединиться.

from bs4 import BeautifulSoup
data='''
<table>
  <tr><td>
    <p>First section of text.</p>
    <p>Second section of text.</span></p>
    <table>
      <tr><td>
        <p>Third section of text.</p>
      </td></tr>
    </table>
  </td></tr>
</table>

<p>Fourth section of text.</p>
'''


soup=BeautifulSoup(data, 'html.parser')
data="".join(item.strip() for item in data.split("</span>"))
print(data)

Вот печатный вывод.

<table>
  <tr><td>
    <p>First section of text.</p>
    <p>Second section of text.</p>
    <table>
      <tr><td>
        <p>Third section of text.</p>
      </td></tr>
    </table>
  </td></tr>
</table>

<p>Fourth section of text.</p>

Используйте декомпозицию, если <span>...</span> тег присутствует в вашем HTMLи хочу удалить его из HTML.

from bs4 import BeautifulSoup
data='''
<table>
  <tr><td>
    <p>First section of text.</p>
    <p>Second section of text.<span>xxxxx</span></p>
    <table>
      <tr><td>
        <p>Third section of text.</p>
      </td></tr>
    </table>
  </td></tr>
</table>

<p>Fourth section of text.</p>
'''


soup=BeautifulSoup(data, 'html.parser')

soup.span.decompose()
print(soup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...