Как мне занести HTML-элементы в черный список с помощью BeautifulSoup?

#python #html #web-scraping #beautifulsoup

#python #HTML #очистка веб-страниц #beautifulsoup

Вопрос:

Это код, который я запускаю:

 import requests
from bs4 import BeautifulSoup

URL = 'https://mangapark.net/manga/tensei-shitara-slime-datta-ken-fuse'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

results = soup.find('section', class_='manga')

manga_title = soup.find('div', class_='pb-1 mb-2 line-b-f hd')

for m_title in manga_title:
    title = m_title.find('a')
    if title != -1:
        print(f'Title: {title.text}')

manga_details = soup.find('table', class_='attr')


for m_details in manga_details:
    th = m_details.find('th')
    td = m_details.find('td')
    #if th != -1 and th != None:
    #    if len(th.text.strip()) ==0:
    #        continue
    #    else:
    #        print(th.text.strip()   ': ')

    if td != -1 and td != None:
        print(td.text.strip())

    print()


 

И когда я получаю текст td, я хочу избавиться от определенного HTML-элемента «i», который обнаруживается при запуске этого кода. Я искал в Интернете и нашел этот код:
https://gist.github.com/braveulysses/120193
Но я новичок в python, поэтому я действительно не знаю, как реализовать этот фрагмент о занесении чего-либо в черный список для моего собственного кода.

 # Remove unwanted tags
    for tag in soup.findAll():
        # Remove blacklisted tags and their contents.
        if tag.name.lower() in tag_blacklist:
            tag.extract()
 

(Этот код начинается со строки 43 и заканчивается на 47 в коде, который я связал)

Комментарии:

1. вы добавляете имена тегов, которые хотите удалить, в tag_blacklist. Предупреждение …. ..extract() удалит вложенные элементы при удалении родительского элемента, поэтому вы можете получить нежелательные результаты.

2. В исходном HTML есть теги i. Я согласен с Грегом, было бы полезно увидеть точный желаемый результат. manga_details в лучшем случае это будет один узел, так что нет необходимости в цикле.

Ответ №1:

Не уверен, что это ожидаемый результат, но вы можете использовать td.get_text('^^',strip=True) , чтобы получить только читаемый человеком текст из td тегов.

Я использовал ^^ , чтобы отметить, где строки могут быть вырезаны, вы также можете использовать другие значения, такие как | или n

И если хотите, вы также можете использовать .stripped_strings для выполнения с ним того, что вам нравится [text for text in td.stripped_strings]

Пример

 import requests
from bs4 import BeautifulSoup

URL = 'https://mangapark.net/manga/tensei-shitara-slime-datta-ken-fuse'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'lxml')

results = soup.find('section', class_='manga')

print(f"Title: {soup.find('div', class_='pb-1 mb-2 line-b-f hd').find('a').get_text()}")

for row in soup.find('table', class_='attr').find_all('tr'):
    th = row.find('th')
    td = row.find('td')
    
    if len(th.get_text()) != 0:
        print(th.get_text()   ': ', td.get_text('^^',strip=True))
 

Вывод

 Title: Tensei Shitara Slime Datta Ken Manga
Rating:  Average 9.8 / 10 out of 3841548 total votes.
Popularity:  24th, it has 11.82k monthly views.
Alternative:  О моём перерождении в слизь                                                                   ;                                                                       关于我转生后成为史莱姆的那件事                                                                 ;                                                                       転生したらスライムだった件                                                                   ;                                                                       전생했더니 슬라임이었던 건에 대하여                                                                 ;                                                                       Regarding My Reincarnation as a Slime                                                                   ;                                                                       Regarding Reincarnated to Slime
Author(s):  Fuse
Artist(s):  Kawakami taiki^^;^^Tensei shitara slime datta ken 79
Genre(s):  Shounen^^,^^Action^^,^^Adventure^^,^^Comedy^^,^^Drama^^,^^Fantasy
Type:  Japanese Manga - Read from right to left.
Release:  2015
Status:  Ongoing
Merged By:  #351432^^#354516^^#377050^^#394320
Latest:  ch.78^^ch.77^^ch.076^^ch.75^^ch.74
 

Комментарии:

1. Круто, это сработало, но я действительно не понимаю, как то, что вы сделали, не уловило первого «tr», в котором было то, что я хотел проигнорировать.

2. Добро пожаловать в SO — Что касается вашего вопроса, я также проверил, есть ли текст в <th> подобном if len(th.get_text()) != 0: , думаю, вы также пробовали это с этой частью вашего кода #if th != -1 and th != None:...