BeautifulSoup: komisches Verhalten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

BeautifulSoup: komisches Verhalten

Beitragvon Clython » Samstag 17. Dezember 2005, 13:49

Hallo

Wenn ich auf dieses html-Dokument:

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="de"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Language" content="de_DE">
<meta http-equiv="expires" content="Sat, 17 Dec 2005 11:32:01 GMT"><title>LexisNexis® Wirtschaft: Dokument</title>


<link rel="stylesheet" href="_files/Global" type="text/css">
<link rel="stylesheet" href="_files/Styles" type="text/css">
<link rel="stylesheet" href="_files/CommonStyles" type="text/css">

<script language="javascript" type="text/javascript" src="_files/resultsInclude.js"></script>
<script language="JavaScript" type="text/javascript" src="_files/results_de_DE_deBusiness.js"></script>
<script language="JavaScript" type="text/javascript" src="_files/results1_de_DE_deBusiness.js"></script>
<script language="JavaScript" type="text/javascript" src="_files/results2_de_DE_deBusiness.js"></script><script language="javascript" src="_files/common.js">
<script language="javascript" type="text/javascript">
// R4.0 Webstar 1541541,Mayank kapoor,08/23/2005 Start(deleting scrollto)
var iCurrentHit=0;
var iTotalHits=12;
</script>
<script language="javascript" type="text/javascript">
var hitsArray = new Array();

hitsArray[0]='HIT_1';

hitsArray[1]='HIT_2';

hitsArray[2]='HIT_3';

hitsArray[3]='HIT_4';

hitsArray[4]='HIT_5';

hitsArray[5]='HIT_6';

hitsArray[6]='HIT_7';

hitsArray[7]='HIT_8';

hitsArray[8]='HIT_9';

hitsArray[9]='HIT_10';

hitsArray[10]='HIT_11';

hitsArray[11]='HIT_12';

</script></head>
<body style="margin: 0pt 5px;" onload="javascript:jumpScrollTo();scrollToLink()">
<a name="top"></a>
<!--LBU DATA : -->
<!--LST : -->
<form name="results_docview_DocumentForm" method="post" action="/de/business/results/shared/results.do">
<input name="totalHits" value="12" type="hidden">
<input name="currentHit" value="0" type="hidden">
<input name="scrollTo" value="" type="hidden">
<input name="hitNo" value="HIT_0" type="hidden">
<span style="padding-left: 7px; padding-right: 7px;"><div class="sevPx"><span class="SS_L3"><span class="verdana">

<center><br>Neue Zürcher Zeitung</center>

<center><br class="br"><a name="ORIGHIT_1"></a><a name="HIT_1"></a><span class="hit"><span>14.</span></span> Juni 2004</center>

<br class="br">Tag der Mutmacherinnen bei der <a name="ORIGHIT_2"></a><a name="HIT_2"></a><span class="hit"><span>CVP</span></span><br class="br"><br class="br"><b>AUTOR:</b> Wehrli C.<br class="br"><br class="br"><b>RUBRIK:</b> Inland; 9<br class="br"><br class="br"><b>LÄNGE:</b> 954 words<br class="br"><br class="br"><span class="loose">Harmonie mit Metzler - Ja zu den Bürgerrechtsvorlagen</span><span class="loose">Die <a name="ORIGHIT_3"></a><a name="HIT_3"></a><span class="hit"><span>CVP</span></span>
hat an einer Delegiertenversammlung die Würdigung ihrer nicht mehr
wiedergewählten Bundesrätin Ruth Metzler nachgeholt.
Interimspräsidentin Doris Leuthard liess Aufbruchstimmung über
Spannungen dominieren. Metzler rief die Partei auf, ihre Rolle als
gesellschaftspolitisch gestaltende Kraft wahrzunehmen. In ihrem Sinn
unterstützten die Delegierten die Bürgerrechtsvorlagen für den 26.
September.</span> <span class="loose">Einer unfreiwillig aus dem Amt
geschiedenen Bundesrätin den Dank der Partei abzustatten - und dies
wenige Tage nachdem die zu Feiernde in einem Buch den führenden Leuten
Fehler und Mutlosigkeit vorgeworfen hatte - , war keine einfache
Aufgabe. Die Christlichdemokratische Volkspartei (<a name="ORIGHIT_4"></a><a name="HIT_4"></a><span class="hit"><span>CVP)</span></span>
hat sie am Samstag unter der interimistischen Leitung von Doris
Leuthard ohne lauten Missklang bewältigt. Zwar fehlte etwa der frühere
Parteipräsident Philipp Stähelin nicht zufällig, und die Teilnahme war
in Schaffhausen insgesamt eher mässig. Auch blieben bei der langen
Schlussovation für Ruth Metzler einige der Anwesenden sitzen. Doch die
positiven Worte von Nationalrätin Leuthard, die letztes Jahr nicht an
vorderster Front involviert gewesen war und der zu Ehrenden in
verschiedener Hinsicht nahesteht, wirkten glaubhaft - wie auch das
Zeichen, dass es mit Fraktionschef Jean-Michel Cina zwar zum
Händedruck, nicht aber zur Umarmung kam.</span><span class="loose">Engagement und Erfolge</span><span class="loose">Doris Leuthard attestierte der ersten <a name="ORIGHIT_5"></a><a name="HIT_5"></a><span class="hit"><span>CVP</span></span>-Frau
im Bundesrat, während viereinhalb Jahren in so schwierigen Bereichen
wie der Migrationspolitik mit Herzblut und Sachverstand gewirkt zu
haben. 14 Volksabstimmungen, in denen sich die "Kämpfernatur" voll
eingesetzt habe, gingen im Sinn der Regierung aus. Das Scheitern der
Bestätigungswahl stellte Leuthard als Konsequenz der von der <a name="ORIGHIT_6"></a><a name="HIT_6"></a><span class="hit"><span>CVP</span></span>
verlorenen Parlamentswahlen hin. Mit Bezug auf das Buch, in dem Metzler
auch die Parteispitze für die ungünstige Ausgangslage verantwortlich
macht, sprach sie von auseinander klaffenden Wahrnehmungen und vom
guten Recht, seine Sicht festzuhalten.</span><span class="loose">Wiederbelebung der Konkordanz</span><span class="loose">In ihrer Eröffnungsansprache hatte Leuthard als Folge des 10. Dezember, eines schwarzen Tags für die <a name="ORIGHIT_7"></a><a name="HIT_7"></a><span class="hit"><span>CVP,</span></span>
gleich die Konkordanz für klinisch tot erklärt. Der Suche nach dem
Kompromiss zögen die "Polparteien" (SVP und SP) ihre "reine Lehre" vor.
Eine solche Politik erziele keine Ergebnisse mehr, sagte sie und
erwähnte die Reihe negativer oder unerwünschter Abstimmungsresultate
(die allerdings keine Vorlagen des neuen Bundesrats betrafen).
Beispiele aus der laufenden Parlamentssession waren das vorläufige
Scheitern des Legislaturplans und die "goldene Illusion" um die
AHV-Finanzierung.</span><span class="loose">Die SVP, die der <a name="ORIGHIT_8"></a><a name="HIT_8"></a><span class="hit"><span>CVP</span></span>
den zweiten Bundesratssitz wegnahm, habe sich noch nicht als
regierungsfähig erwiesen, fuhr Leuthard fort. Die Nagelprobe werde die
Europapolitik sein, wo die SVP offensichtlich alles Erreichte zunichte
machen wolle. Die <a name="ORIGHIT_9"></a><a name="HIT_9"></a><span class="hit"><span>CVP</span></span>
habe sich nun keinesfalls am ideologischen Wettrüsten zu beteiligen,
sondern als bekennende Zentrumskraft wieder zu wachsen, um mitgestalten
zu können. Als Grundlage für einen Kurs der Marktwirtschaft in sozialer
und ökologischer Verantwortung soll das Programm "Aufbruch Schweiz"
dienen, über das nun in der Partei diskutiert wird. Als Ziel gilt die
Wiederbelebung der Konkordanz zum Wohl des gesellschaftlichen
Ausgleichs und Zusammenhalts.</span><span class="loose">Metzlers Gesellschaftspartei</span><span class="loose">Nachdem
in letzter Zeit viel von Entfremdung zwischen der früheren Bundesrätin
und ihrer Partei die Rede gewesen war, versicherte Ruth Metzler den
Delegierten, sie fühle sich in der <a name="ORIGHIT_10"></a><a name="HIT_10"></a><span class="hit"><span>CVP</span></span>
zu Hause; denn diese trete für Werte ein, die ihr persönlich und für
das Vorankommen des Landes wichtig seien. Da immer mehr erkannt werde,
dass der Egotrip ein Holzweg sei, und da die Globalisierung geradezu
nach Spielregeln rufe, sei mit der Freiheit die Verantwortung gegenüber
Mitmenschen und Umwelt hochzuhalten. Die Chance der <a name="ORIGHIT_11"></a><a name="HIT_11"></a><span class="hit"><span>CVP</span></span>
liege darin, in diesem Sinn als die gesellschaftspolitische Partei zu
wirken. Wie in ihrem Buch, aber in eher ermutigendem Ton rügte Metzler
das Verhalten der Partei (Kritik sei eine notwendige Etappe), wofür ihr
das Nichteintreten der Fraktion auf die Entkriminalisierung des
Haschischkonsums eine neue gute Gelegenheit gab. Manchmal habe sie den
Eindruck, das ganze Land schliesse die Augen vor den Problemen, obwohl
die Schweizer keine Realitätsverweigerer seien. Für die <a name="ORIGHIT_12"></a><a name="HIT_12"></a><span class="hit"><span>CVP</span></span>
gelte es nun, mit mehr Zivilcourage interessierte Menschen
anzusprechen. Mit den von der amtierenden Präsidentin übernommenen
Begriffen Solidarität, Subsidiarität, Offenheit und Nachhaltigkeit
wurde zwar noch kein Programm skizziert, jedoch Verbundenheit mit der
Partei bezeugt.</span><span class="loose">Einbezug von Papier-Ausländern</span><span class="loose">Konkret
wurde Ruth Metzler, als sie für die Neuregelung des Bürgerrechts
plädierte - eine von ihr mit besonderem Engagement vorangetriebene
Reform, über die, soweit die Verfassung zu ändern ist, am 26. September
abgestimmt wird. Für junge, in der Schweiz aufgewachsene Ausländer soll
die Einbürgerung durch einheitliche Regeln erleichtert werden, und in
der dritten Generation soll das Schweizer Bürgerrecht grundsätzlich
durch Geburt erworben werden. Die frühere EJPD-Chefin betonte das
Interesse der Schweiz, integrierte junge Menschen, die oft nur noch auf
dem Papier Ausländer seien, mit allen Rechten und Pflichten zu uns
gehören zu lassen und ihr Potenzial zu nutzen, statt sie durch
Einbürgerungshindernisse wie aneinander gereihte Wohnsitzfristen und
hohe Gebühren vor den Kopf zu stossen. Gerade auch die direkte
Demokratie sei ein Grund, die Immigrierten der zweiten und dritten
Generation in die Verantwortung einzubeziehen. Die Delegierten
beschlossen die Ja-Parolen mit 163 zu 2 und 163 zu 3 Stimmen und je
einer Enthaltung.</span><br class="br"><br class="br"><b>UPDATE:</b> 14. Juni 2004<br class="br"><br class="br"><b>SPRACHE:</b> GERMAN; DEUTSCH<br class="br"><br class="br"><b>PUBLICATION-TYPE:</b> Newspaper<br class="br"><br class="br"><b>ZEITUNGS-CODE:</b> NZZ<center><br class="br"><br>Copyright 2004 AG für Die Neue Zürcher Zeitung NZZ<br> All rights reserved</center></span></span></div></span>
<div id="lineheight">
 
</div>

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="_files/s.gif" alt="" height="8" width="3"></td>
</tr>
<tr>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td class="resultsfooterborder">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td rowspan="4" align="center" width="10"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td align="center" width="732"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td rowspan="4" align="center" width="7"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>
<tr>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="100%">

<tbody><tr>
<td class="l4b" align="right" nowrap="nowrap" width="10%">Suchbegriffe:</td>
<td class="l4b" width="7"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td class="l4b">[CVP](800)</td>
<td class="l4b" align="right">  </td>
</tr>





<tr>
<td colspan="4" class="l4b" nowrap="nowrap"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>

<tr>
<td class="l4b" align="right" nowrap="nowrap" width="10%">Quelle:</td>
<td class="l4b"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td class="l4b"><input name="" src="_files/but_info_v3.gif" onclick="return openSourceInfoWindow('/de/business/results/shared/sourceInfo.do?sourceName=Neue%2BZ%25C3%25BCrcher%2BZeitung%2B%2526%2BNZZ%2Bam%2BSonntag&sourceTypeInd=S&csi=12122')" style="border: 0pt none ;" title="Quellenbeschreibung" alt="Quellenbeschreibung" align="center" type="image"> [Neue Zürcher Zeitung & NZZ am Sonntag]</td>
<td class="l4b"> </td>
</tr>

<tr>
<td colspan="4" class="l4b" nowrap="nowrap"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>


<tr>
<td class="l4b" align="right" nowrap="nowrap" width="10%">Anzeige:</td>
<td class="l4b"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td class="l4b"> Volltext</td>
<td class="l4b"> </td>
</tr>

<tr>
<td colspan="4" class="l4b" nowrap="nowrap"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>

<tr>
<td class="l4b" align="right" nowrap="nowrap" width="10%">Sortierung:</td>
<td class="l4b"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td class="l4b"> Datum</td>
<td class="l4b"> </td>
</tr>

<tr>
<td colspan="4" class="l4b" nowrap="nowrap"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>
<tr>
<td class="l4b" align="right" nowrap="nowrap" width="10%">Datum/Zeit:</td>
<td class="l4b" width="7"><img src="_files/s.gif" alt="" height="7" width="7"></td>
<td class="l4b">17 Dezember 2005 12:22:00</td>

<td class="l4b" align="right"><a href="#top">Nach oben</a></td>
</tr>
<tr>
<td colspan="4" class="l4b" nowrap="nowrap"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td>

</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td align="center"><img src="_files/s.gif" alt="" height="7" width="7"></td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>

</td>
</tr>
<tr><td><br><table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr><td><img src="_files/s.gif" alt="" height="15" width="7"></td></tr>
<tr><td><img src="_files/s.gif" alt="" height="14" width="1"></td></tr>
<tr><td><img src="_files/s.gif" alt="" height="7" width="1"></td></tr>
<tr><td width="100%">




<table align="center" border="0" cellpadding="0" cellspacing="0" width="60%">
<tbody>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="14" width="1"></td>
</tr>
<tr>
<td style="border: 0px none ; background-image: url(images/bg_dash.gif); height: 1px;"></td>
</tr>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="7" width="1"></td>
</tr>
</tbody>
</table>
<table align="center" border="0" cellpadding="0" cellspacing="0">
<!-- Beginning of footer with navigation -->

<tbody><tr>
<td class="l3" align="center">
<table class="l3" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td nowrap="nowrap"><a href="http://www.lexisnexis.com/de/business/search/loadForm.do" class="link" target="_self" onclick="Javascript:if(parent.document.getElementById('fs_main')!= null ){target='_parent';}else if(parent.parent.parent.document.getElementById('fs_main')!= null){target='rosettaBaseFrame';} ">Suche</a></td><td><img alt="" src="_files/s.gif" border="0" height="5" width="8"></td><td><span class="l3d">|</span></td><td><img alt="" src="_files/s.gif" border="0" height="5" width="8"></td><td nowrap="nowrap"><a href="http://www.lexisnexis.com/de/business/srcsel/sourceDirectory.do?origin=SRCDIR" class="link" target="_self" onclick="Javascript:if(parent.document.getElementById('fs_main')!= null ){target='_parent';}else if(parent.parent.parent.document.getElementById('fs_main')!= null){target='rosettaBaseFrame';} ">Quellenverzeichnis</a></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td align="center">
<table align="center" border="0" cellpadding="0" cellspacing="0" width="60%">
<tbody>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="5" width="1"></td>
</tr>
</tbody>
</table>
</td>
</tr>

<tr>
<td class="l4" align="center">
<table class="l4" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td nowrap="nowrap"><font class="l4b"><b>Allgemeine Suche</b></font></td>
</tr>
</tbody>
</table>
</td>
</tr>

<tr>
<td align="center">
<table align="center" border="0" cellpadding="0" cellspacing="0" width="60%">
<tbody>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="9" width="1"></td>
</tr>
</tbody>
</table>
</td>
</tr>


<!-- Ending footer with navigation -->
<tr>
<td class="l4b" align="center">
<table class="l4" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td><a href="http://www.lexisnexis.de/ueberuns" class="link" onclick="return openTerms(this)">Über LexisNexis</a></td>
<td><img src="_files/s.gif" alt="" border="0" height="5" width="5"></td>
<td class="l4"><span class="l3d">|</span></td>
<td><img src="_files/s.gif" alt="" border="0" height="5" width="5"></td>
<td><a href="http://www.lexisnexis.com/de/business/auth/displayterms.do?content=GENERAL" class="link" onclick="return openTerms(this)">Nutzungsbedingungen</a></td>



<td><img src="_files/s.gif" alt="" border="0" height="5" width="5"></td>
<td class="l4"><span class="l3d">|</span></td>
<td><img src="_files/s.gif" alt="" border="0" height="5" width="5"></td>

<td><a href="http://www.lexisnexis.com/de/business/auth/myid.do" class="link" target="_self" onclick="Javascript:openWindow('/de/business/auth/myid.do',250,130);return false;">Mein Nutzername</a></td>



</tr>
</tbody>
</table>
</td>
</tr>
</tbody></table>
<table align="center" border="0" cellpadding="0" cellspacing="0" width="60%">
<tbody>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="7" width="1"></td>
</tr>
<tr>
<td style="border: 0px none ; background-image: url(images/bg_dash.gif); height: 1px;"></td>
</tr>
</tbody>
</table>
<table align="center" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td align="center">
<table align="center" border="0" cellpadding="0" cellspacing="0" width="60%">
<tbody>
<tr>
<td><img src="_files/s.gif" alt="" border="0" height="5" width="1"></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td align="center"><span class="l4b"> <a href="http://www.lexisnexis.com/terms/copr/lngp/de/" onclick="return openCopyright(this)">Copyright©</a> 2005 <a href="javascript:openExternalLink('http://www.lexisnexis.de/')" class="l4b">LexisNexis</a>. Alle Rechte vorbehalten.</span></td>
</tr>
</tbody></table>
</td></tr>
</tbody></table></td></tr>

</tbody></table>

</form>
</body></html>


diesen Code laufen lasse:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF8 -*-

# ln2xml 0.01
# Author: Maël Mettler
# Home: www.mediamonger.ch
# e-mail: ln2xml@mediamonger.ch
# License: GNU v2

from BeautifulSoup import BeautifulSoup
import re, codecs

file = codecs.open("test3",encoding="utf-8")
html = file.read()

soup = BeautifulSoup(html)
div_content = soup.html.body.div
print len(div_content('center'))

center_content = soup.html.body.div.center
print center_content.encode("latin1")


krieg ich eine 3 (korrekt) und ein Null (komisch!) zurück. Warum kriege ich nicht den Inhalt des Tags zurück?
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Beitragvon Clython » Samstag 17. Dezember 2005, 13:59

Anscheinend lag das Problem bei den Encodings (once again!). Ich werde das wohl erst beim Abspeichern des Resultates bereinigen können. Wenn jemand gute Vorschläge hat, bin ich trotzdem dankbar.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Beitragvon Clython » Sonntag 18. Dezember 2005, 11:07

Ich habe was neues gefunden, wo der Fehler definitiv bei Soup liegt. Wenn ich ein html-File Parse, dass Umlaute enthält, verändert Soup diese (Ä zu Ä&bdquo; etc.). Ich musste diese mit Entities maskieren, damit meine replace und re Aufrufe richtig funktionieren. Gibt es da auch eine bessere Lösung?
BlackJack

Beitragvon BlackJack » Sonntag 18. Dezember 2005, 22:24

Da es weder bei BeautifulSoup noch beim zugrunde liegenden SGML Parser eine Möglichkeit gibt die Kodierung anzugeben, könntest Du mal versuchen das Dokument vorher selbst zu einem Unicode-Objekt zu dekodieren.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]