ich habe ein Problem mit Beautiful Soap und hoffe, dass ihr mir vielleicht einen Tipp
geben könnt.
Die Basis meines Scripts ist der Quelltext dieser Website :
https://unicode.org/charts/index.html
Das einzige, was ich verändert habe, ist, dass ich den Inhalt des <style> Tags durch
"Dummy" ersetzt habe, also :
Code: Alles auswählen
<style>
# Dummy
</style>
andauernd HTTP Request ausführe.
Die Problematik :
Zur Übung beschäftige ich mich hier nur mit dem Header, also :
Code: Alles auswählen
<head>
<meta charset="utf-8"/>
<link href="https://www.unicode.org/webscripts/standard_styles.css" type="text/css" rel="stylesheet">
<title>Code Charts</title>
<style>
# Dummy
</style>
</head>
auf die Funktionen '.children' & '.descendants'. Ich habe folgende Code geschrieben :
Code: Alles auswählen
with open("index.html") as fh:
bs = BeautifulSoup(fh, "html.parser")
bs_elements = bs.contents # Gesamter Source Code der Website
bs_header = bs.head # Gesamter Header des HTML Dokuments
if not bs_header:
print("The HTML Doc Has No Header !")
exit(0)
bs_title_tag = bs.title
bs_title_text = bs.title.string
print(f"title : {bs_title_text}") # Standard - Ausgabe des Titels
print(f"title : {bs_title_tag}") # Ausgabe des Titels Inkl. Tags
print(f"title : {bs_title_tag.contents}") # Ausgabe des Titels als Liste"
print()
print(f"Header : \n")
print(f"Numbers Of Childs : {len( list(bs_header.children))}")
print(f"Numbers Of Descendants : {len( list(bs_header.descendants))}")
print()
childs = bs_header.descendants
for child in childs:
print(child.name)
Code: Alles auswählen
Numbers Of Childs : 9
Numbers Of Descendants : 11
None
meta
None
link
None
title
None
None
style
None
None
Anhand der Beschreibung habe ich es so interpretiert dass <head> nur ein child hat, und das ist head.
<title> , <metacharset> usw. sind ja Descendants. Deshalb kam mir die Zahl 9 bei den Childs sehr
hoch vor. Also habe ich meinen Code folgendermaßen angepasst :
Code: Alles auswählen
with open("index.html") as fh:
bs = BeautifulSoup(fh, "html.parser")
bs_elements = bs.contents # Gesamter Source Code der Website
bs_header = bs.head # Gesamter Header des HTML Dokuments
if not bs_header:
print("The HTML Doc Has No Header !")
exit(0)
bs_title_tag = bs.title
bs_title_text = bs.title.string
print(f"title : { bs_title_text }") # Standard - Ausgabe des Titels
print(f"title : { bs_title_tag }") # Ausgabe des Titels Inkl. Tags
print(f"title : { bs_title_tag.contents }") # Ausgabe des Titels als Liste"
print()
bs_header = bs_header.prettify().replace("\n", "") # Ersetze Zeilenumbrüche
header_raw = BeautifulSoup(bs_header, "html.parser") # Erzeuge neues Beautiful Soap OBJ
test = header_raw.find_all(string=" ") # Ersetze leere Strings
for t in test:
t.replace_with("")
print(f"Header : \n")
print(f"Numbers Of Childs : {len(list(header_raw.children))}")
print(f"Numbers Of Descendants : {len(list(header_raw.descendants))}")
print()
print(header_raw)
childs = header_raw.descendants
for child in childs:
print(child.name)
Code: Alles auswählen
Numbers Of Childs : 1
Numbers Of Descendants : 11
head
None
meta
None
link
None
title
None
None
style
None
Nach dem Entferne der Zeilenumbrüche und Leerzeichen liegt der
Quelltext in folgendem Format vor :
Code: Alles auswählen
<head><meta charset="utf-8"/><link href="https://www.unicode.org/webscripts/standard_styles.css" rel="stylesheet" type="text/css"/><title> Code Charts </title><style> # Leer </style></head>
Es stimmt ja auch mit der Anzahl der Decendants überein.
Ich kann es mir nur nicht erklären.
# 1 <head>
# 2 <meta charset>
# 3 <link>
# 4 <title>
# 5 Code Charts
# 6 </title>
# 7 <style>
# 8 # Leer
# 9 </style>
#10 </head>
Vielen Dank für Eure Hilfe !
VG
YAPD