Как получить элементы с заданным размером шрифта c и удалить все, кроме первого появления? - PullRequest
0 голосов
/ 26 февраля 2020

Я хотел бы напечатать все элементы с размером шрифта = 4 и 5 и удалить все, кроме первого появления

Я использую следующий код, но пока я получаю только все параграфы soup.find_all('p'). Как я могу отфильтровать из этого вывода все, которые имеют размер шрифта 4 или 5 и удалить все повторы?

from bs4 import BeautifulSoup

with open("file.html", "rb") as fp:                      
    soup = BeautifulSoup(fp,"html5lib") 

soup.find_all('p')

Пример файла ниже

<!DOCTYPE html> <html> <body> <h1>Some header</h1> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 1</p> <p> <font size="5">India!</font> </p> <p>Some text 2</p> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 3</p> <p> <font size="5">Uganda!</font> </p> <p>Some text 4</p> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 5</p> <p> <font size="5">India!</font> </p> <p>Some text 6</p> <p> <font size="5">Cameroon!</font> </p> <p>Some text 7</p> <p> <font size="4">India!</font> </p> <p>Some text 8</p> <p> <font size="5">India!</font> </p> <p>Some text 9</p> <p> <font size="5">India!</font> </p> <p>Some text 10</p> <p> <font size="5">Pakistan!</font> </p> <p>Some text 11</p> <p> <font size="5">Pakistan!</font> </p> <p>Some text 12</p> <p> <font size="5">India!</font> </p> <p>Some text 13</p> <p> <font size="4">Uganda!</font> </p> <p> <font size="5">India!</font> </p> <p>Some text 14</p> <p> <font size="4">India!</font> </p> <p> This is other text. </p> </body> </html>

1 Ответ

1 голос
/ 27 февраля 2020

Это должно делать то, что вы хотите:

text = """<!DOCTYPE html> <html> <body> <h1>Some header</h1> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 1</p> <p> <font size="5">India!</font> </p> <p>Some text 2</p> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 3</p> <p> <font size="5">Uganda!</font> </p> <p>Some text 4</p> <p> <font size="5">India!</font> <p> <font size="4">Japan!</font> </p> </p> <p>Some text 5</p> <p> <font size="5">India!</font> </p> <p>Some text 6</p> <p> <font size="5">Cameroon!</font> </p> <p>Some text 7</p> <p> <font size="4">India!</font> </p> <p>Some text 8</p> <p> <font size="5">India!</font> </p> <p>Some text 9</p> <p> <font size="5">India!</font> </p> <p>Some text 10</p> <p> <font size="5">Pakistan!</font> </p> <p>Some text 11</p> <p> <font size="5">Pakistan!</font> </p> <p>Some text 12</p> <p> <font size="5">India!</font> </p> <p>Some text 13</p> <p> <font size="4">Uganda!</font> </p> <p> <font size="5">India!</font> </p> <p>Some text 14</p> <p> <font size="4">India!</font> </p> <p> This is other text. </p> </body> </html>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(text,"html.parser")

sizes = []
def _recursive_search(elem):
    if not hasattr(elem, "children"):
        return ""

    children = ""
    for child in elem.children:
        if hasattr(child, "children") and child.children:
            if child.name == "font":
                print(child.text)
                if child.attrs.get('size') in sizes:
                    continue
                sizes.append(child.attrs['size'])

            child = _recursive_search(child)
        else:
            child = child
        children += str(child)

    attrs = ""
    for a, v in elem.attrs.items():
        attrs += f' {a}="{v}"'

    return f"""<{elem.name}{attrs}>{children}</{elem.name}>"""

def search(soup):
    new = ""
    for child in soup.children:
        new += _recursive_search(child)

    return "<!DOCTYPE html>" + new

print(
    BeautifulSoup(
        search(soup),
        "html.parser"
    ).prettify()
)

Вывод:

India!
Japan!
India!
India!
Japan!
Uganda!
India!
Japan!
India!
Cameroon!
India!
India!
India!
Pakistan!
Pakistan!
India!
Uganda!
India!
India!
<!DOCTYPE html>
<html>
 <body>
  <h1>
   Some header
  </h1>
  <p>
   <font size="5">
    India!
   </font>
   <p>
    <font size="4">
     Japan!
    </font>
   </p>
  </p>
  <p>
   Some text 1
  </p>
  <p>
  </p>
  <p>
   Some text 2
  </p>
  <p>
   <p>
   </p>
  </p>
  <p>
   Some text 3
  </p>
  <p>
  </p>
  <p>
   Some text 4
  </p>
  <p>
   <p>
   </p>
  </p>
  <p>
   Some text 5
  </p>
  <p>
  </p>
  <p>
   Some text 6
  </p>
  <p>
  </p>
  <p>
   Some text 7
  </p>
  <p>
  </p>
  <p>
   Some text 8
  </p>
  <p>
  </p>
  <p>
   Some text 9
  </p>
  <p>
  </p>
  <p>
   Some text 10
  </p>
  <p>
  </p>
  <p>
   Some text 11
  </p>
  <p>
  </p>
  <p>
   Some text 12
  </p>
  <p>
  </p>
  <p>
   Some text 13
  </p>
  <p>
  </p>
  <p>
  </p>
  <p>
   Some text 14
  </p>
  <p>
  </p>
  <p>
   This is other text.
  </p>
 </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...