Замените классы CSS на месте, используя Beautifulsoup - PullRequest
0 голосов
/ 29 января 2019

Я анализирую HTML-документ и хочу получить все теги css blockquote класса "FlatParagraph", однако есть некоторые классы, которые включают в себя другой класс, который я хотел бы исключить "FlatParagraph view-history-note".Я думаю заменить класс «FlatParagraph view-history-note» классом «view-history-note».

Мой вопрос похож на этот (если лучший метод - заменить нежелательный класс) ( Замена имени класса BeautifulSoup ), однако мне нужно, чтобы обновленные классы оставались на месте висходный код, который я запрашиваю в дальнейшем, и мне нужен подход find_all (), а не find (), так как существует более одного класса "FlatParagraph view-history-note" для замены.Я подумал, может быть, регулярное выражение, но возникли проблемы с преобразованием строки обратно в HTML для дальнейшего запроса.

Я бы очень признателен за любую помощь, спасибо.

Вот пример формата.Я хочу исключить <BLOCKQUOTE class="FlatParagraph view-history-note"> строки.

<!doctype html>
<html lang="en">
    <head>
        <div>I don't want this tag</div>
        <p>I have already been extracted</p>
        <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>
            <BLOCKQUOTE class="FlatParagraph view-history-note">I don't want to keep this part</BLOCKQUOTE>
            <BLOCKQUOTE class="FlatParagraph view-history-note">I don't want to keep this part</BLOCKQUOTE>
            <BLOCKQUOTE class="FlatParagraph view-history-note">I don't want to keep this part</BLOCKQUOTE>
        <p>I have already been extracted</p>
        <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>
        <p>I have already been extracted</p>
        <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>
        <p>I have already been extracted</p>
        <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>
            <BLOCKQUOTE class="FlatParagraph view-history-note">I don't want to keep this part</BLOCKQUOTE>
    </head>
</html>

Я пробовал soup.select(".FlatParagraph"), но при этом также извлекаются цитаты .FlatParagraph view-history-note.

Я также пытался получить все дочерние элементы от родителя, возвращаются только первые 10 или около того дочерних элементов (html имеет длину более 1000 строк).

Ожидаемые результаты для HTML выше будут

[<BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>, <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>, <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>, <BLOCKQUOTE class="FlatParagraph">I want to keep this part</BLOCKQUOTE>]

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Можно выбрать два варианта:

# using CSS selector
r = soup.select('blockquote[class="FlatParagraph"]')

# using lambda
r = soup.find_all(lambda tag: tag.name == 'blockquote' and tag.get('class') == ['FlatParagraph'])

(взято из BeautifulSoup - Как найти только определенное имя класса )

оба исключат результаты безнежелательные теги:

[<blockquote class="FlatParagraph">I want to keep this part</blockquote>, <blockquote class="FlatParagraph">I want to keep this part</blockquote>, <blockquote class="FlatParagraph">I want to keep this part</blockquote>, <blockquote class="FlatParagraph">I want to keep this part</blockquote>]

однако результат будет содержать теги в нижнем регистре, так как все теги имеют нижний регистр в соответствии со спецификацией HTML , поэтому «Если вы хотите сохранить теги в смешанном или верхнем регистре иатрибуты, вам нужно проанализировать документ как XML . "

0 голосов
/ 29 января 2019

Если BeautifulSoup разрешает все CSS-селекторы, тогда soup.select(".FlatParagraph:not(.view-history-note)") должен работать, исключая элементы с классом FlatPragraph, которые также имеют класс view-history-note.

Для получения дополнительной информации о псевдо-селекторе :not():https://developer.mozilla.org/en-US/docs/Web/CSS/:not

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