Die Story:Disable spezielle "class" -Attribut Handhabung
Wenn Sie HTML mit BeautifulSoup
analysieren, class
Attribut gilt als multi-valued attribute und wird in besonderer Weise behandelt:
Denken Sie daran, dass ein einzelnes Das Tag kann mehrere Werte für sein Attribut "class" haben. Wenn Sie nach einem Tag suchen, das einer bestimmten CSS-Klasse entspricht, stimmen Sie mit allen CSS-Klassen überein.
Auch ein Zitat aus einem eingebauten in HTMLTreeBuilder
von BeautifulSoup
als Basis für andere Tree-Builder-Klassen verwendet, wie zum Beispiel HTMLParserTreeBuilder
:
# The HTML standard defines these attributes as containing a
# space-separated list of values, not a single value. That is,
# class="foo bar" means that the 'class' attribute has two values,
# 'foo' and 'bar', not the single value 'foo bar'. When we
# encounter one of these attributes, we will parse its value into
# a list of values if possible. Upon output, the list will be
# converted back into a string.
Die Frage:
Wie kann ich BeautifulSoup
so konfigurieren, dass class
als normales einwertiges Attribut gehandhabt wird? Mit anderen Worten, ich möchte nicht, dass es speziell mit class
arbeitet und es als reguläres Attribut ansieht.
FYI, hier ist eine der Anwendungsfälle, wenn es hilfreich sein kann:
Was ich habe versucht:
Ich habe tatsächlich in es funktioniert, indem Sie eine benutzerdefinierte Baum Builder Klasse und entfernen class
aus der Liste der speziell behandelten Attribute:
from bs4.builder._htmlparser import HTMLParserTreeBuilder
class MyBuilder(HTMLParserTreeBuilder):
def __init__(self):
super(MyBuilder, self).__init__()
# BeautifulSoup, please don't treat "class" specially
self.cdata_list_attributes["*"].remove("class")
soup = BeautifulSoup(data, "html.parser", builder=MyBuilder())
Was ich nicht bei diesem Ansatz ist, dass es sehr „unnatürlich“ und „magische“ Beteiligung „private“ interne _htmlparser
importieren. Ich hoffe es gibt einen einfacheren Weg.
HINWEIS: Ich möchte alle anderen HTML-Parsing-Funktionen speichern, dh ich möchte HTML
nicht mit "xml" -only-Funktionen analysieren (was eine andere Problemumgehung hätte sein können).
Ich dachte, es wäre ein Fehler, als ich deinen Avatar unter einer schönen, nicht beantworteten Frage sah und dann merkte ich, dass du die Frage * gestellt * hast! Ich kann dir nicht helfen, alles was ich versucht habe, hat nicht funktioniert oder zwei Iterationen involviert. – dstudeba
Ich weiß nicht, wie das geht, aber für den spezifischen Anwendungsfall, der als Beispiel angegeben wurde, habe ich eine andere Antwort angegeben (also habe ich sie dort gepostet). Es ist meiner Meinung nach einfacher, aber möglicherweise nicht ausreichend für andere Anwendungsfälle – rll
Verwenden Sie es als CSS-Selektor ?. Vielleicht könnte in diesem Fall die einfachste Option nicht ein gemeinsamer Klassenselektor, sondern ein Attributselektor sein. Selector '.myclass' ist genau das gleiche wie '[class = ~ "myclass"]', aber selector '[class = "class"]' ist ein Element, dessen Attributwert "class" exakt gleich "myclass" ist (nicht Myclass in einer Liste mit Leerzeichen getrennt). –