Как убрать "baca" или прочитать из html? - PullRequest
1 голос
/ 23 июня 2019

Мне удалось создать простую программу для URL-адресов веб-страниц и перевести html, извлеченный на английский.Однако для этого конкретного веб-сайта (ссылка ниже) "html.find_all ('p')" также извлекает нежелательные теги p, встроенные в теги привязки.

Пример 1. HTML-код, который мне не нужен

<p>Baca: <a href="https://nasional.tempo.co/read/1216929/soenarko-sarankan-kivlan-zen-berhati-hati-omongan-diviralkan">Soenarko Sarankan Kivlan Zen Berhati-hati Omongan Diviralkan</a></p>

Пример 2: HTML, который я хочу

<p>"Ya, jadi penangguhan penahanan ini, pertama kami memang mengajukan penangguhan penahanan," kata Ferry membuka sesi wawancara. Hari itu, Mabes Polri telah mengabulkan penanggungan penahanan terhadap Soenarko yang menjadi tersangka kepemilikan senjata ilegal.</p>

Есть ли способ, с помощью которого я могу получить код для фильтрации примера 1 и сохранить только пример 2?

link = "https://nasional.tempo.co/read/1216914/moeldoko-penangguhan-penahanan-soenarko-bisa-diterima"

webpage_response = requests.get(link)
webpage = webpage_response.content
page = BeautifulSoup(webpage, "html.parser")

html_title = page.find("title")
title2 = html_title.get_text()
title = title2.strip("- Bisnis Tempo.co")

html = page.find(attrs={"itemprop": "articleBody"})
text = html.find_all("p")

Ответы [ 3 ]

0 голосов
/ 23 июня 2019

Здесь

import requests
from bs4 import BeautifulSoup

r = requests.get("https://nasional.tempo.co/read/1216914/moeldoko-penangguhan-penahanan-soenarko-bisa-diterima")
if r.status_code == 200:
    page = BeautifulSoup(r.content, "html.parser")
    html = page.find(attrs={"itemprop": "articleBody"})
    # find 'p' elements but without nested elements
    for item in html.find_all(lambda tag: tag.name == 'p' and len(list(tag.children)) <= 1):
        print(item)

выход

<p>"Panglima TNI kan pembina bagi para purnawirawan, jadi dengan pertimbangan-pertimbangan tersendiri Panglima melakukan itu," kata Moeldoko, saat ditemui di Gedung Krida Bakti, Komplek Istana Negara, Jakarta Pusat, Jumat, 20 Juni 2019. Ia mengapresiasi langkah Panglima memberikan jaminan penangguhan penahanan itu.</p>
<p>Moeldoko mengatakan meski saat ini berstatus tersangka kasus kepemilikan senjata ilegal, namun Soenarko tetap seorang purnawirawan TNI. "Pertimbangan-pertimbangan Panglima, pasti sudah dipertimbangkan masak-masak," kata Moeldoko.</p>
<p>Selain Hadi, penjamin penangguhan penahanan Soenarko adalah Menteri Koordinator Bidang Kemaritiman, Luhut Binsar Panjaitan. Kepala Biro Penerangan Masyarakat Mabes Polri Brigadir Jenderal Dedi Prasetyo mengatakan alasan Luhut bersedia menjamin penangguhan penahanan adalah karena Soenarko tokoh senior di TNI.</p>
<p>Menteri Koordinator Bidang Politik, Hukum, dan Keamanan Wiranto mengatakan senjata itu berasal dari Aceh. Senjata itu diperkirakan ada kaitannya dengan kerusuhan 22 Mei 2019.</p>
0 голосов
/ 23 июня 2019

В bs4 4.7.1 вы можете использовать: not and: содержит селекторы псевдоклассов для указания абзацев, которые нужно исключить, если они содержат определенный текст. В этом случае я бы сделал немного более надежным, расширив текст теста исключения, как на странице, и добавив идентификатор, ограничивающий содержание статьи.

from bs4 import BeautifulSoup as bs #4.7.1
import requests

r = requests.get('https://nasional.tempo.co/read/1216914/moeldoko-penangguhan-penahanan-soenarko-bisa-diterima/full&view=ok')
soup = bs(r.content, 'lxml')
paras = [p.text for p in soup.select('#isi p:not(:contains("Baca juga:"))')]
print(paras)
0 голосов
/ 23 июня 2019

Укажите условие для проверки наличия текста 'Baca' и пропустите его.

from bs4 import BeautifulSoup
import requests
link = "https://nasional.tempo.co/read/1216914/moeldoko-penangguhan-penahanan-soenarko-bisa-diterima"

webpage_response = requests.get(link)
webpage = webpage_response.content
page = BeautifulSoup(webpage, "html.parser")

html_title = page.find("title")
title2 = html_title.get_text()
title = title2.strip("- Bisnis Tempo.co")

html = page.find(attrs={"itemprop": "articleBody"})
items = html.find_all("p")

for item in items:
    if not ('Baca' in item.text):
        print(item)

Или вы можете использовать функцию degpose () для удаления.

from bs4 import BeautifulSoup
import requests
link = "https://nasional.tempo.co/read/1216914/moeldoko-penangguhan-penahanan-soenarko-bisa-diterima"

webpage_response = requests.get(link)
webpage = webpage_response.content
page = BeautifulSoup(webpage, "html.parser")

html_title = page.find("title")
title2 = html_title.get_text()
title = title2.strip("- Bisnis Tempo.co")

html = page.find(attrs={"itemprop": "articleBody"})
items = html.find_all("p")

for item in items:
    if 'Baca' in item.text:
        item.decompose()

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