2016-07-20 6 views
1

Ich benutze BeautifulSoup lxml Parser, um einige HTML zu analysieren. Es wird jedoch nicht analysiert, wie es geschrieben wurde. Zum Beispiel der folgende Code:BeautifulSoup lxml Parser schließende Tags, wo es nicht sein sollte

import bs4 

my_html = ''' 
<html> 
<body> 
<B> 
<P> 
Hello, I am some bolded text 
</P> 
</B> 
</body> 
</html> 
''' 

soup = bs4.BeautifulSoup(my_html, 'lxml') 
print soup.prettify() 

druckt:

<html> 
<body> 
    <b> 
    </b> 
    <p> 
    Hello, I am some bolded text 
    </p> 
</body> 
</html> 

Sie können das irgendwie sehen die <B> Tag aus my_html wird vor dem <p>-Tag in der prettified Version geschlossen, obwohl es sein sollte nach der </p> geschlossen sein. Irgendwelche Ideen darüber, was passieren könnte? Ich bin total verblüfft.

Antwort

1

Dies liegt daran, dass Sie kein <p>-Tag innerhalb eines <b>-Tags haben können, sodass der Parser versucht, fehlerhaftes HTML zu reparieren. Mit dem html5lib Parser von html5lib oder dem html.parser von Python erhalten Sie Ihre erwartete Ausgabe (ich weiß das nur, weil ich sie gerade getestet habe).

+0

Danke, ich werde in jene aussehen, obwohl ich vor, zumindest einige andere Probleme mit dem 'html.parser' hatte. – George

2

Das liegt daran, dass Absätze innerhalb des Tags <b> nicht zulässig sind.

Nur Tags, die Flow-Inhalt akzeptieren, sind als übergeordnetes Element von <p> Tags zulässig. Eine Liste finden Sie unter here.

Sie können jedoch das Gegenteil tun; <p> ist als übergeordnetes Element für <b> Tags zulässig. In Ihrem Fall können Sie Ihre RAW-HTML zu so etwas wie dies ändern:

my_html = ''' 
<html> 
<body> 
<p> 
<b> 
Hello, I am some bolded text 
</b> 
</p> 
</body> 
</html> 
''' 
+0

Danke, obwohl dies eine Datei ist, die ich scrappe, also würde ich gerne mit diesem Fall umgehen können, da ich nicht wirklich die Kontrolle darüber habe, wie das Dokument aussehen wird. – George

+0

@George: In diesem Fall scheint 'html5lib' die beste Wette zu sein, nach [dieser Antwort] (http://stackoverflow.com/a/23394822/2741678). Es funktioniert wie erwartet für Ihren Fall. – Sumit