Пропустить div класс с в веб-просмотре div - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь очистить веб-сайт, и мой образец html выглядит следующим образом

<div class="ism-true"><!-- message -->
                    <div id="post_message_5437898" data-spx-slot="1">

                        OK, although it's been several weeks since I installed the 

    <div><label>Quote:</label></div>
    <div class="panel alt2" style="border:1px inset">

        <div>
            Originally Posted by <strong>DeltaNu1142</strong>
        </div>
        <div style="font-style:italic">The very first thing I did </div>

    </div>
</div>When I got my grille back from the paint shop, I went to work on the
                    </div>
                    <!-- / message --></div>

<div class="ism-true"><!-- message -->
                    <div id="post_message_5125716">

                        <div style="margin:1rem; margin-top:0.3rem;">
    <div><label>Quote:</label></div>
    <div class="panel alt2" style="border:1px inset">

        <div>
            Originally Posted by <strong>HCFX2013</strong>
        </div>
        <div style="font-style:italic">I must be the minority that absolutely can't .</div>

    </div>
</div>Hello World.
                    </div>
                    <!-- / message --></div>

Я хочу текст, который находится только в классе сообщений, но не в классе "панели alt2". Положение класса внутри "div id =" post_message_ "постоянно меняется. Как можно игнорировать текст в классе alt2 панели.

Мой код.

text = []
for item in soup.findAll('div',attrs={"class":"ism-true"}):
    result = [item.get_text(strip=True, separator=" ")]
    div = item.find('div', class_="panel alt2")
    if div :
        result[0] = ' '.join(result[0].split(div.text.split()[-1])[1:])
        text.append(result[0])
    else:
        text.append(result)

Только приведенный выше код дает мне текст, когда "Panel alt2" является первым классом внутри в классе div. Это не работает, если положение класса меняется и выдает ошибку как "List index out of range". Можете ли вы помочь мне игнорировать эти классы. Ожидаемый результат

[OK, although it's been several weeks. When I got my grille back from the paint shop, I went to work on the],[Hello world]

образец сайта (https://www.f150forum.com/f118/fab-fours-black-steel-elite-bumper-adaptive-cruise-relocation-bracket-387234/)

1 Ответ

1 голос
/ 23 января 2020

Подход, который может быть осуществимым, состоит в том, чтобы extract из div с классом panel alt2 и тегом label. Следующий код, кажется, работает на сайте, а также ваш пример html.

import requests
from bs4 import BeautifulSoup
URL = 'https://www.f150forum.com/f118/fab-fours-black-steel-elite-bumper-adaptive-cruise-relocation-bracket-387234/'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
text = []
for div in soup.find_all('div', class_="ism-true"):
    try:
        div.find('div', class_="panel alt2").extract()
    except AttributeError:
        pass  # sometimes there is no 'panel alt2'
    try:
        div.find('label').extract()
    except AttributeError:
        pass  # sometimes there is no 'Quote'
    text.append(div.text.strip())

print(text)

Вывод с вашим примером:

["OK, although it's been several weeks since I installed the \n\n    \n\nWhen I got my grille back from the paint shop, I went to work on the", 'Hello World.']

Вы можете удалить новую строку символы, если вам это не нужно

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