Как очистить HTML-элементы без указания класса или идентификатора, указанного в атрибуте Beautifulsoup4 - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу очистить отдельное описание контента от страницы, я могу сделать это с class или id , указанным в attribute .Но .. я не знаю, как получить элемент, если в теге html не указан атрибут class или id .

Мне нравится этот скриншот:

enter image description here

<div class="cat_box_desc">
    <h3>Status:</h3>
    on-going <br>
    <h3>Genres:</h3>

    <br>
    <h3>Description:</h3>
    <div align="justify">
        <p> Information</p>
        <p>Type: TV</p>
        <p>Episodes: Unknown</p>
        <p>Status: Currently Airing</p>
        <p>Aired: Oct 7, 2013 to ?</p>
        <p>Producers: Sunrise, TV Tokyo, Sotsu Agency</p>
        <p>Genres: Mecha</p>
        <p>Duration: 25 min. per episode</p>
        <p>Synopsis:</p>
        <p>Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya adalah seorang anak laki-laki yang bernama Iori Sei. Sei memiliki kemampuan merangkai Gundam yang hebat, namun dia tak
            memiliki kemampuan untuk mengendalikan gundam yang ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia bertemu dengan seorang pencuri roti misterius, yang memberinya sebuah batu permata.</p>
    </div><br>
    <div style="padding-left: 560px; padding-bottom:20px;" class="spacebook">
        <div class="fb-like" data-href="http://animeindo.video/category/gundam-build-fighter/" data-width="450" data-layout="box_count" data-show-faces="false" data-send="false"></div>
    </div>
</div>

Я могу очистить данные внутри class="cat_box_desc", но я получу все данные внутри, я неНе хочу, я хочу разделить данные.

Я не знаю, чтобы отделить данные, как на скриншоте выше. Есть status , жанр , описание , информация и другие в тегах H1 и P , так как нет идентификатора class или указано на нем.

Так как это сделать в Beautifulsoup4 ..?

1 Ответ

0 голосов
/ 18 декабря 2018

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

Для полей, разделенных :, я бы проанализировал ихдля облегчения доступа к словарю:

import re

from bs4 import BeautifulSoup

data = """
<div class="cat_box_desc">
    <h3>Status:</h3>
    on-going <br>
    <h3>Genres:</h3>

    <br>
    <h3>Description:</h3>
    <div align="justify">
        <p> Information</p>
        <p>Type: TV</p>
        <p>Episodes: Unknown</p>
        <p>Status: Currently Airing</p>
        <p>Aired: Oct 7, 2013 to ?</p>
        <p>Producers: Sunrise, TV Tokyo, Sotsu Agency</p>
        <p>Genres: Mecha</p>
        <p>Duration: 25 min. per episode</p>
        <p>Synopsis:</p>
        <p>Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya adalah seorang anak laki-laki yang bernama Iori Sei. Sei memiliki kemampuan merangkai Gundam yang hebat, namun dia tak
            memiliki kemampuan untuk mengendalikan gundam yang ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia bertemu dengan seorang pencuri roti misterius, yang memberinya sebuah batu permata.</p>
    </div><br>
    <div style="padding-left: 560px; padding-bottom:20px;" class="spacebook">
        <div class="fb-like" data-href="http://animeindo.video/category/gundam-build-fighter/" data-width="450" data-layout="box_count" data-show-faces="false" data-send="false"></div>
    </div>
</div>"""

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

# first locate the container with the desired fields
description = soup.find("h3", text="Description:").find_next_sibling()

# get all the ":"-separated fields into a dictionary 
pattern = re.compile(r"\w+:\s.*?")

data = dict(field.split(":") for field in description.find_all(text=pattern))

print(data)

Печать:

{'Type': ' TV', 'Episodes': ' Unknown', 'Status': ' Currently Airing', 'Aired': ' Oct 7, 2013 to ?', 'Producers': ' Sunrise, TV Tokyo, Sotsu Agency', 'Genres': ' Mecha', 'Duration': ' 25 min. per episode'}

Теперь это не перехватывает Synopsis, так как его значение находится в отдельном элементе p, но выможно получить через:

data["Synopsis"] = description.find("p", text="Synopsis:").find_next_sibling("p").get_text()

Полный предварительный вывод:

{'Aired': ' Oct 7, 2013 to ?',
 'Duration': ' 25 min. per episode',
 'Episodes': ' Unknown',
 'Genres': ' Mecha',
 'Producers': ' Sunrise, TV Tokyo, Sotsu Agency',
 'Status': ' Currently Airing',
 'Synopsis': 'Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. '
             'Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya '
             'adalah seorang anak laki-laki yang bernama Iori Sei. Sei '
             'memiliki kemampuan merangkai Gundam yang hebat, namun dia tak\n'
             '            memiliki kemampuan untuk mengendalikan gundam yang '
             'ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia '
             'bertemu dengan seorang pencuri roti misterius, yang memberinya '
             'sebuah batu permata.',
 'Type': ' TV'}

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

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