#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:...