Zanurkuj w Pythonie/Dodawanie cudzysłowów do wartości atrybutów
Dodawanie cudzysłowów do wartości atrybutów
[edytuj]Dość powszechnym pytaniem na comp.lang.python jest "Mam kilka dokumentów HTML z wartościami atrybutów bez cudzysłowów i chciałbym odpowiednio te cudzysłowy dodać. Jak mogę to zrobić?"[1] (Przeważnie wynika to z dołączenia do projektu nowego kierownika, będącego wyznawcą HTML-owych standardów i bezwzględnie wymagającego, aby wszystkie strony bezbłędnie przechodziły kontrolę HTML-owych walidatorów. Wartości atrybutów bez cudzysłowów są powszechnym naruszeniem HTML-wego standardu.) Niezależnie od powodu, uzupełnienie cudzysłowów jest łatwe przy pomocy klasy BaseHTMLProcessor
.
BaseHTMLProcessor
konsumuje HTML-a (ponieważ jest potomkiem klasy SGMLParser
) i produkuje równoważny HTML, ale ten wyjściowy HTML nie jest identyczny z wejściowym. Znaczniki i nazwy atrybutów zostaną zapisane małymi literami, nawet jeśli wcześniej były dużymi lub wymieszanymi, a wartości atrybutów zostaną zamknięte w podwójnych cudzysłowach, nawet jeśli wcześniej były otoczone pojedynczymi cudzysłowami lub nie miały żadnych cudzysłowów. To jest taki efekt uboczny, z którego możemy tu skorzystać.
>>> htmlSource = """ #(1)
... <html>
... <head>
... <title>Test page</title>
... </head>
... <body>
... <ul>
... <li><a href=index.html>Strona główna</a></li>
... <li><a href=toc.html>Spis treści</a></li>
... <li><a href=history.html>Historia zmian</a></li>
... </body>
... </html>
... """
>>> from BaseHTMLProcessor import BaseHTMLProcessor
>>> parser = BaseHTMLProcessor()
>>> parser.feed(htmlSource) #(2)
>>> print parser.output() #(3)
<html>
<head>
<title>Test page</title>
</head>
<body>
<ul>
<li><a href="index.html">Strona główna</a></li>
<li><a href="toc.html">Spis treści</a></li>
<li><a href="history.html">Historia zmian</a></li>
</body>
</html>
- Zauważmy, że wartości atrybutów href w znacznikach <a> nie są ograniczone cudzysłowami. (Jednocześnie zauważmy, że używamy potrójnych cudzysłowów do czegoś innego niż notki dokumentacyjnej i to bezpośrednio w IDE. Są one bardzo użyteczne.)
- "Karmimy" parser.
- Używając funkcji
output
zdefiniowanej w klasieBaseHTMLProcessor
, otrzymujemy wyjście jako pojedynczy kompletny łańcuch znaków ze wszystkimi wartościami atrybutów w cudzysłowach. Pomyślmy, jak wiele właściwie się tutaj działo:SGMLParser
sparsował cały dokument HTML, podzielił go na znaczniki, odwołania, dane tekstowe itp.;BaseHTMLProcessor
użył tych elementów do zrekonstruowania części HTML-a (które nadal są składowane wparser.pieces
, jeśli chcesz je zobaczyć); na końcu wywołaliśmyparser.output
, która to metoda połączyła wszystkie części HTML-a w jeden napis.
Przypisy
- ↑ No dobra, to nie jest aż tak powszechne pytanie. Nie jest częstsze niż "Jakiego edytora powinienem używać do pisania kodu w Pythonie?" (odpowiedź: Emacs) lub "Python jest lepszy czy gorszy od Perla?" (odpowiedź: "Perl jest gorszy od Pythona, ponieważ ludzie chcieli aby był gorszy." -Larry Wall, 10/14/1998). Jednak pytania o przetwarzanie HTML-a pojawiają się w takiej czy innej formie około raz na miesiąc i wśród tych pytań, to jest dość popularne.