I have a file that I want to make soup with- this is only an excerpt:
<p facs="#facs_14_TextRegion_1624023825755_566">
<lb facs="#facs_14_line_1624023773342_555" n="N001"/>Und wiewol eyn solcher Mensch behelt eyn <w>Frei<pc>-</pc>
<lb/>heyt</w> seines willens, doch schwach und verletzet, daraus
<lb facs="#facs_14_r1l25" n="N003"/>als eynem brunnen herfliessen alle ehrliche tugent und <w>tha<pc>-</pc>
<lb/>ten</w> der heiden sampt iren wirckungen, So kan er doch vor
<lb facs="#facs_14_r1l27" n="N005"/>der gnaden und ehe dann er wider zu recht gebracht ist,
<lb facs="#facs_14_r1l28" n="N006"/>die gerechtigkeyt, die vor Gott gilt, nit erreychen, sonder
<lb facs="#facs_14_r1l29" n="N007"/>ist vil mehr eyn knecht der Sünden, des Teüfels eygen
<lb facs="#facs_14_r1l30" n="N008"/>und eyn feind Gottes und allen straffen diser welt <w>under<pc>-</pc>
<lb/>worffen</w>, dann er wirdt beschwärt mit hunger, kummer,
<lb facs="#facs_14_r1l32" n="N010"/>durst, frost, hitz, schmertzen, kranckheyt und wirdt entlich
<lb facs="#facs_14_r1l33" n="N011"/>durch den tod zerstöret. Dann <q>die sünde ist durch eynen
<lb facs="#facs_14_line_1623337148499_448" n="N012"/><note place="margin-right" facs="#facs_14_TextRegion_1624023908878_596">
<lb facs="#facs_14_line_1623337734932_504" n="N001"/>Roma. 5.</note>menschen inn die welt kommen unnd durch die sünde der
<lb facs="#facs_14_r1l35" n="N013"/>tod</q><note type="annotation"><ref type="biblical" cRef="Rm_5,12">Röm 5,12</ref>.</note>. Es seind aber die straffen diser ersten übertrettung
<lb facs="#facs_14_r1l36" n="N014"/>denen, die von neuem durch die genad geboren werden,
<lb facs="#facs_14_r1l37" n="N015"/>mit den sündern gemeyn, wiewol sie den neugebornen auch
<lb facs="#facs_14_r1l38" n="N016"/>zur übung auffgelegt werden, Aber den ungerechten und
<lb facs="#facs_14_r1l39" n="N017"/>Gottlosen werden sie zur straff zugeschickt.
</p>
Now, what I want to do is get all and their content, regardles of what the cRef's text actually is. (It's a standardised set of shorthands depicting bible passages). I think am not sure whether I can use cRefs = soup.findAll(attrs={"type":"biblical"}), as we might have elements that are type="biblical" but don't have a cRef.All elements that have a cRef should be, and I am not the one tagging the document, , though.
Any hints on how to do that?
Edit: my Code so far:
import bs4 as bs
with open('interim.xml', 'r') as f:
file = f.read()
soup = bs.BeautifulSoup(file, 'lxml')
Refs = soup.find_all(attrs={'type':'biblical'})
print(Refs)
expected output:
[<ref cref="Gn_1,26-27" type="biblical">Gen 1,26f.</ref>, <ref cref="Sir_15,14" type="biblical">Sir 15,14</ref>, <ref cref="Rm_5,12" type="biblical">Röm 5,12</ref> ]
(only an excerpt) - it might happen that not all of the elements share type="biblical", though.
for an individual element in Refs I can use Refs[i].get('cref') for retrieving the value, which I also need at a later time.
Is there a way in BS to tetrieve only elements that have a certain attribute?
Edit2: bcs I found out that I can do
Refs = soup.find_all(attrs={'cref':True})
All the best and thanks in advance,
K
After some more coffee, I searched again and found that
Refs = soup.find_all(attrs={'cref':True})
works flawlessly for what I want.
Related
I would appreciate your help on this scraping problem.
I would like to scrape this site: https://www.trustedshops.de/bewertung/info_XDAD39B874C275A0751198C2510C3C670.html
Although my code does not give me an error message, I do not see any output. I believe the problem is the bs.find_all statement; basically, I have problems telling the code how to index the user reviews.
# import
import pandas as pd
import requests
from bs4 import BeautifulSoup
# create a function to get all the user comments
def get_comments(lst_name):
# find all user comments and save them to a list
#comment = bs.find_all(class_=[("ng-tns-c84-5.main-box.no-margin.mb-3.ng-star-inserted")])
# iterate over the list to get the text and strip the strings
for c in comment:
lst_name.append(c.get_text(strip=True))
# return the list
return lst_name
What is the correct class for the Trusted Shops website that I need for the bs.find_all statement?
Thank you lots!!
The reviews of the url aren't dynamic but you have to select the locator in proper way.It's working.
from bs4 import BeautifulSoup
import requests
url = 'https://www.trustedshops.de/bewertung/info_XDAD39B874C275A0751198C2510C3C670.html'
req = requests.get(url)
print(req)
soup = BeautifulSoup(req.content,'lxml')
for review in soup.find_all("review",class_="ng-tns-c116-5 main-box no-margin mb-3 ng-star-inserted"):
comment=review.select_one('.loading-line div').get_text()
print(comment)
Output:
Bestellvorgang war sehr einfach. Toll geordnete Homepage auf der alles schnell und einfach zu
finden ist. Auch die Bezahlung war einfach abzuwickeln. Alles sehr übersichtlich.
Betreut wird man von BTA hervorragend. Mails mit hilfreichen Tipps und Videos mit Hinweisen zum Handling des Geräts findet man nach der Bestellung ausreichend im Postfach. Und kostenlose Probe-Sticks gab´s auch noch dazu.
Einzig der Versand hat sich etwas verzögert. Aber nach einer freundlichen Erinnerung ging dann alles ganz schnell.
Habe den glo gerade ausgepackt. Er macht einen soliden und stabilen Eindruck. Werde ihn natürlich gleich ausprobieren und dann geht er in den regelmäßigen Gebrauch. Wenn ich die Möglichkeit erhalte berichte ich gerne nochmal wie er sich im Dauereinsatz nutzen lässt.
Na, und dann muss ich auch noch heraus finden welche Geschmacksrichtung bei den Sticks für mich die richtige ist.
Bis jetzt bin ich sehr zufrieden!
Leider habe ich mein Gerät noch nicht von glo direkt erhalten, dies finde ich etwas schade.
Sa wir derzeit mit einem Gerst zu zweit erhitzten. Dies ist etwas umständlich.
Ich habe sehr gehofft, dass mein Paket noch vor Ostern kommt. Da ich eine Woche davor bestellt hatte. Aber leider kommt es wohl erst morgen (Dienstag nach Ostern an).
Durch die Benutzung von 2 Personen bei einem Gerät, hält der Akku auch nicht so lange.
Aber morgen hat das Warten wohl eine Ende.
Ich habe es erst seit 2 Tagen und konnte mich noch nicht wirklich damit hin setzen und wirklich testen. Bis jetzt kann ich sagen das mir der Design ganz gut gefällt auch das man den Panel
wechseln und mit andere Farb Kombinationen zusammen stecken kann. Das Tabak ist nichts im Gegensatz zu einer normalen Zigaretten aber wenn mich das davon abhält eine Zigarette zu rauchen dann werde ich für den Übergang das Glo.
Mir gefiel das der Umstieg von der herkömmlichen Zigarette so einfach war, die Vielfalt an Geschmacksrichtungen, das Design, die Aktionen.
Der Filter sollte eher geschlossen als halb-offen sein dann schmecken die Neo-Sticks besser, sie haben sonst nach 3-4 Zügen einen eigenartigen unangenehmen Geschmack. Bei den Doppel-Click
Varianten ist es nicht so. Da passt es bis zum letzten Zug.
Alles gut ! Glo (und auch Iqos) sind beide sehr gut um nicht mehr Zigaretten zu konsumieren. Man merkt erst wenn man die Tabakerhitzer probiert nach ein paar Tagen wie gut es schmecken kann. Am Anfang ist es sehr gewöhnungsbedürftig, aber es lohnt sich. Wir nutzen schon seit ein paar Jahren Tabakerhitzer und haben keine einzige Zigarette mehr geraucht. Man fühlt sich einfach besser !
Auf dem Weg zur Reduzierung mit dem Ziel gänzlich mit dem Rauchen aufzuhören, bin ich auf diesen Heater umgestiegen und muss sagen: Chapeau! Für mich vorerst eine gute Alternative. Wenn hier noch weiter daran getüffelt wird eine gesunde Alternative zu erstellen und auf Nachhaltigkeit geachtet wird, würde ich sogar dabei bleiben wollen.
Ich habe mich über DHL geärgert ! Ich habe zwei mal eine Anlieferabsage bekommen und beim dritten mal haben sie das Päckchen wegen angeblichen nicht Erreichbarkeit in einem DHL Shop zur Selbstabholung hinterlegt. Und dabei war ich zu Hause. Aber sonst ist alles okay !
Es gefällt mir dass man selber und die Wohnung nicht mehr wie ein kalter Aschenbecher müffelt
den man hat im Regen stehen lassen. Ebenso fällt es sehr viel leichter keine normalen Zigaretten mehr zu rauchen. Ein guter Weg um mit dem Rauchen aufhören zu können.
Sehr guter Erhitzer. Die Neos schmecken und es gibt eine große Auswahl. Zudem rauche ich länger an einer als an normalen Zigaretten. Als starker Raucher hätte ich nicht gedacht das ich mich an sowas gewöhnen könnte. Aber es macht einfach Spaß und schmeckt
Die Neo Sticks sind sehr aromatisch. Ein Sternabzug: habe mich gewundert, dass bei der Bestellung meines 2. HEATERS ein weiteres Panel dabei war. Bei meinem 1. Heater ist das Panel garnicht auszutauschen. Warum ?
Der Glow ist wirklich toll. Das einzige was mir nicht so gefällt ist die begrenzte Dauer von 4 Minuten.
Wenn Die 4 Minuten abgelaufen sind und ich nehme den Stick heraus ist er nicht mal zur Hälfte
abgebrannt.
evtl die Session um 1-3 min erhöhen ?
manchmal kommt es einem in der bereits längsten Version doch sehr kurz vor, vor allem, wenn der Akku im Gerät bereits dem Ende zu geht.
Der Kunden Service ist perfekt. Meine Bestellung vom 21.4.22 des Tabak Heater habe ich noch nicht erhalten, kann über den Gebrauch noch keine Bewertung abgeben.
Unkomplizierte Bestellung! Gerät erscheint nicht Billig wie erwartet aber ich persönlich finde es etwas Stark. Ich werde weiter testen und eventuell bearbeiten
Die Produktvielfalt noch etwas erweitern mit neuen Geschmacksrichtungen. Noch längere Akkulaufzeiten. Preise stabil halten und nicht ständig verteuern.
Ich mag die Vielfalt an verschiedenen Geschmacksrichtungen und auch das die Rauch-Zeit festgelegt ist..... Von mir aus könnte es mehr Farben geben
für mich zu viele mit Geschmacks-click-sorten.. Einfach nur Tabak in ein paar mehr Variationen wäre mir lieber. Sonst find ich glo top.
Im großen und ganzen bin ich zufrieden, muß mich nur noch an die Geschmacksrichtungen gewöhnen und die richtige Sorte herausfinden.
Glo sollte länger die zigatette heizen kühlt schnell ab dann wird es schwach beim tziehen. Die zigarettenstiks könten stärker sein
Der Heater ist super. Die bisher ausprobierten NEOS gefallen mir gut.
Mit dem Service lief es ein wenig problematisch.
The easiest way is to just use the api. You need to write the required number of reviews in payload (size). Here is a simple example
def get_comments(page_id):
url = f"https://shop-profiles-reviews-api.trustedshops.com/shopreviews/{page_id}"
payload = json.dumps({
"categories": [
"ALL"
],
"sort": {
"field": "relevance",
"order": "desc"
},
"page": {
"size": 20,
"pageIndex": 0
},
"includeReviewCount": True
})
headers = {
'accept': 'application/json',
'content-type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
json_obj = json.loads(response.text)
# total_comments = json_obj['metaData']['totalReviewCount']
for review in json_obj['reviews']:
print(review['buyerLastName'], review['buyerFirstName'])
print(review['buyerStatement'])
print('------')
print(json.loads(response.text)['metaData']['totalReviewCount'])
then just put the page id in the function:
get_comments('XDAD39B874C275A0751198C2510C3C670')
I'm struggling with the deezer api.
I want to perform a request which contains umlaute.
While the usual python requests library converts the following:
'album:"Ich schwanke noch" artist:"Ikke Hüftgold"'
To this api search request:
https://api.deezer.com/search/album?q=album%3A%22Ich+schwanke+noch%22+artist%3A%22Ikke+H%C3%BCftgold%22
Which is from utf-8 standards, totally fine as long as I understood.
But unfortunately, deezer don't accept them or just delivers an empty result.
This would be the code to reproduce:
import requests
search_url = 'https://api.deezer.com/search/'
query_type = 'album'
query = 'album:"Ich schwanke noch" artist:"Ikke Hüftgold"'
response = requests.get(
search_url + query_type, params={'q': query}
)
print(response.url)
After a deep dive I found out, deezer accepts only the following character set.
Only the two Unicode (HTML) from this article:
https://de.wikipedia.org/wiki/Hilfe:Sonderzeichenreferenz
So manually the request look like this:
https://api.deezer.com/search/album?q=album:%22Ich%20schwanke%20noch%22%20artist:%22Ikke%20Hüftgold%22
But how on earth could I tell python to encode using this set.
I didn't find anything till now.
I would love to found help on this way.
This has nothing to do with the encoding, it's how you are using the the search API:
import requests
search_url = 'https://api.deezer.com/search/'
query = 'Ikke Hüftgold Ich schwanke noch'
response = requests.get(
search_url, params={'q': query}
)
resp = response.json()
for item in resp["data"]:
print(item['title'], item['artist']['name'], item['album']['title'], item['album']['id'])
Out:
Ich schwanke noch Ikke Hüftgold Ich schwanke noch 226034622
Ich schwanke noch Ikke Hüftgold Ballermann Playa Hits 2021 235679732
Ich schwanke noch Ikke Hüftgold Après Ski Hütten Hits 2022 271034782
Ich schwanke noch Ikke Hüftgold Oktoberfest Megamix 2021 248418852
Ich schwanke noch Ikke Hüftgold Ballermann Charts 2021 - Der Sommer unseres Lebens 239857652
Ich schwanke noch Ikke Hüftgold Ballermann Après Ski Mega Hits 2022 271529842
Ich schwanke noch Ikke Hüftgold Ballermann Après Ski Party Hits 2022 270321652
Ich schwanke noch Ikke Hüftgold Ballermann Après-Ski Party 2022 269952722
Ich schwanke noch Ikke Hüftgold Wiesn Megamix 2021 : Die Oktoberfest Party Hits 247638622
Ich schwanke noch Ikke Hüftgold Karneval Megamix 2022 282534992
Ich schwanke noch Ikke Hüftgold Ballermann Summer Megahits 2021 - Die Party Songs Von Der Playa 241106462
Ich schwanke noch Ikke Hüftgold Oktoberfest Partyhits 2021: Die Kracher aus dem Bierzelt 255573382
Ich schwanke noch Ikke Hüftgold Ballermann Partyalarm 2021 246561782
Ich schwanke noch Ikke Hüftgold Ballermann Oktoberfest Hits 2021 246828062
Ich schwanke noch Ikke Hüftgold Ballermann Ski Hits Top 100 2022: Der ultimative Party Megamix 263551832
Ich schwanke noch Ikke Hüftgold Ballermann Hüttengaudi 2022 270698482
Ich schwanke noch Ikke Hüftgold Hütten Charts Megamix 2022: Die ultimative Après Ski Party 270840962
Ich schwanke noch Ikke Hüftgold Ballermann Party Knüller 2021 237380692
Ich schwanke noch Ikke Hüftgold Ballermann - We Are Back - Die Party Hits Des Sommers 2021 239281792
Ich schwanke noch Ikke Hüftgold Après Ski Megahits 2022 258969192
Ich schwanke noch Ikke Hüftgold Ballermann Party Classics: Die besten Hits von damals bis heute 242757312
Ich schwanke noch Ikke Hüftgold Ballermann Schlager Hitmix 2021.2 249705922
Ich schwanke noch Ikke Hüftgold Oktoberfest CLASSICS XXL : Die besten Wiesn Party Hits von damals bis heute 257765392
Ich schwanke noch Ikke Hüftgold Ballermann Oktoberfest 2021 249970202
Ich schwanke noch Ikke Hüftgold Oktoberfest Party Classics 2021 249529552
Edit:
You need to convert non-ASCII characters to HTML Unicode entities:
#coding: utf-8
import html
import requests
response = requests.get("https://api.deezer.com/search/album?q=album:%22Ich%20schwanke%20noch%22%20artist:%22Ikke%20Hüftgold%22")
expectedResponse = response.json()
query = 'album:"Ich schwanke noch" artist="Ikke Hüftgold"'
q = html.escape(query, quote=False).encode('ascii', 'xmlcharrefreplace').decode()
print(q)
response = requests.get(
"https://api.deezer.com/search/album", params={'q': q}
)
resp = response.json()
print(response.url)
print(expectedResponse == resp)
Out:
album:"Ich schwanke noch" artist="Ikke Hüftgold"
https://api.deezer.com/search/album?q=album%3A%22Ich+schwanke+noch%22+artist%3D%22Ikke+H%26%23252%3Bftgold%22
True
Within a div tag there is text I wan to extract but within a leading introduction and a footer which is unfortunatelly inside the div.
There are always 3 BR tags at the beginning and 2 BR tags at the end of the text, where the text inbetween might also be devided with BR tags itself.
The simple example looks like this:
<div class="text" itemprop="description">
bla
<br>
bla
<br>
<br>
text
<br>
text
<br>
text
<br>
<br>
bla
</div>
The full example:
response.xpath('//div[#itemprop="description"]').extract_first()
'<div class="text" itemprop="description">jung<br><br>Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.<br><br>Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.</div>'
Trying to remove the tags by performing a string method did not solve the issue, as I will also remove the BR inbetween and I do also want to remove the unwanted header/footer.
response.xpath('string(//div[#itemprop="description"])').extract_first()
Expected output:
Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens
abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat
sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist
ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal
ob groß oder klein, und versteht sich auch mit Katzen und anderen
Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell
heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und
Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er
hat bis März bei uns gelebt und war dann für 1,5 Monate in einer
anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab
und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war
aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich
nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz
findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen
und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen
Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre
es schön, wenn er einen Partner zum Spielen hätte, da er es als
Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft
und entwurmt.
Expected removal:
jung
Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.
How can the leading text and the footer text be removed and the rest extracted?
You can use the following XPath :
//div[#itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]
Code :
data = """HTML
<div class="text" itemprop="description">jung<br><br>Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.<br><br>Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.</div>
HTML"""
import lxml.html
tree = lxml.html.fromstring(data)
print (tree.xpath('//div[#itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]'))
Output :
['Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.']
Tested OK with :
https://www.quoka.de/tiermarkt/hunde/c5030a285861882/pyrenaeenberghund-ruede.html
https://www.quoka.de/tiermarkt/hunde/c5030a287343999/vorwitzige-west-highland-terrier-welpen.html
https://www.quoka.de/tiermarkt/hunde/c5030a287685487/shih-tzu-welpen-bleiben-klein.html
https://www.quoka.de/tiermarkt/hunde/c5030a287859602/chihuahua-welpen-huendinnen.html
EDIT : XPath explanation :
We look for text nodes child of a specific div. The text nodes has to fulfill the following conditions :
not to be the last text node (to exclude "Weitere Angaben...")
the second preceding sibling element of the text node has to be a br element (to exclude the first text elements like dog breed and statut)
That way, the XPath expression select the text nodes after the first two consecutive br (<br/><br/>) and stop before the last text node.
I need to parse an XML file but unfortunately, I don't have any experience with that before.
Here is a shortened version of the xml file:
<red>
<kopf Art="TAZ-Bericht" Quelle="taz Berlin" Ressort="Berlin" DatNr="203943" Qnum="10678" Edat="31.03.2015" Titel="Bauarbeiter klagen Lohn ein" Titel2="JUSTIZ Radikale Gewerkschaft unterstützt geprellte Bauarbeiter des Einkaufstempels Mall of Berlin " Seite="23" Style="t_H2_text" Worte="310" Zeichen="2188" Zeilen="73" Len="Mittel" Autor="PETER NOWAK"/>
<Titel>Bauarbeiter klagen Lohn ein</Titel>
<Unterzeile><Spitz>JUSTIZ </Spitz>Radikale Gewerkschaft unterstützt geprellte Bauarbeiter des Einkaufstempels Mall of Berlin </Unterzeile>
<Brot>Der Arbeitskampf um die Fertigstellung des Einkaufszentrums Mall of Berlin wird nun die Gerichte beschäftigten. Insgesamt zehn Klagen hat der Anwalt der Basisgewerkschaft Freie Arbeiter Union (FAU) in der vergangenen Woche beim Berliner Arbeitsgericht eingereicht. Sie richten sich gegen zwei Subunternehmen. Kläger sind Bauarbeiter aus Rumänien, die über die beiden Leiharbeitsfirmen auf der Baustelle der Mall of Berlin beschäftigt und nach eigenen Angaben um einen Großteil ihres Lohns geprellt worden waren.</Brot>
<Brot>Gemeinsam mit der FAU hatten die Bauarbeiter in den vergangenen Monaten zahlreiche Protestaktionen rund um das höherpreisige Einkaufszentrum organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik stand dabei auch der mittlerweile insolvente Generalübernehmer und der Bauherr Harald Huth. Zudem hat die FAU einen offenen Brief an die Senatorin für Arbeit, Dilek Kolat (SPD), verfasst. Darin will sie von der Senatorin wissen, warum die Landesgesetze zulassen, dass in Berlin Unternehmen aktiv sind, die nicht gewährleisten könnten, „dass die von ihnen oder ihren Subkontraktoren beschäftigten ArbeiterInnen ordentlich behandelt und entlohnt werden“. Die FAU moniert zudem, dass die um ihre Löhne geprellten Bauarbeiter keinerlei Unterstützung vom Senat erhalten habe. </Brot>
<Zwischentitel>Monatelang mittellos</Zwischentitel>
<Brot>Die Gewerkschaft betont, dass auch der Rechtsweg für die Betroffenen oft keine Lösung ist. „Wer von ihnen kann es bewältigen, hier monatelang mittellos auszuharren, rechtliche Verfahren einzuleiten und möglicherweise durch verschiedene Instanzen zu gehen?“ Allein diese Hürde sorge dafür, dass die Bauunternehmer mit ihren „dubiosen Praktiken“ davonkommen könnten, heißt es in dem Brief. Ein Sprecher der Senatorin sagte der taz, bisher habe man das Schreiben nicht erhalten. </Brot>
<Brot>Auch die Sprecherin für Soziale Menschenrechte der Linksfraktion im Bundestag, Azize Tank, sieht die Berliner Politik in der Verantwortung. „Der Senat muss dafür sorgen, dass die Finanzkontrolle eingeschaltet wird, um auf die Missstände endlich zu reagieren“, sagte sie der taz. <zAutor> PETER NOWAK</zAutor></Brot>
</red>
So in this document, I want to get content of every tag except <kopf> and zAutor tags. (Note that zAutor tag is a subfield of last Brot tag in this example.
I have just learnt how to get a content of specific tag:
import xml.etree.ElementTree as ET
tree = ET.parse(fname)
root = tree.getroot()
for i in tree.findall('.//Brot'):
print(i.text)
But this also doesn't work fully functional. It only prints some part of the content of tags.
When switching to lxml (as it has better xPath support ... and I found far more pointers on how to do such a basic task), you can simply delete the unwanted tags from your XML and then process the remaining at will:
import lxml.etree as et
xml = '''<red>
<kopf/>
<Titel>Bauarbeiter klagen Lohn ein</Titel>
<Brot>Gemeinsam mit der FAU hatten die Bauarbeiter zahlreiche Protestaktionen organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik und anderswo.</Brot>
<Zwischentitel>Monatelang mittellos</Zwischentitel>
<Brot>Auch die Sprecherin sieht die Berliner Politik in der Verantwortung. <zAutor>PETER NOWAK</zAutor></Brot>
</red>'''
tree=et.fromstring(xml)
for tags in tree.xpath("//*[self::kopf or self::zAutor]"):
tags.getparent().remove(tags)
print (et.tostring(tree, pretty_print=True, xml_declaration=False).decode())
returns this:
<red>
<Titel>Bauarbeiter klagen Lohn ein</Titel>
<Brot>Gemeinsam mit der FAU hatten die Bauarbeiter zahlreiche Protestaktionen organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik und anderswo.</Brot>
<Zwischentitel>Monatelang mittellos</Zwischentitel>
<Brot>Auch die Sprecherin sieht die Berliner Politik in der Verantwortung. </Brot>
</red>
Following is the Sample from .xml file:
<title>Kaufsignal für Marriott International</title>
<link>https://insideparadeplatz.ch/2015/03/06/kaufsignal-fuer-marriott-international/</link>
<pubDate>Fri, 06 Mar 2015 </pubDate>
<content:encoded>
<![CDATA[
<p class="p1">
<span class="s1">Mit Marken wie Bulgari, Ritz-Carlton, Marriott und weiteren ist Marriott International nach sämtlichen Kriterien, die vom <a href="http://www.obermatt.com/de/home.html">
<span class="s2">Obermatt-System</span></a></span> bewertet werden, ein interessantes Investment. Der Titel ist relativ gesehen günstig, das Unternehmen sollte weiter überproportional wachsen, und es ist solide finanziert, mit einem guten Verhältnis von Eigenkapital und Schulden. Über alle Kategorien gesehen landet die
<span class="s3">Marriott-Aktie</span></a>, die derzeit an der Technologiebörse Nasdaq bei rund 84 Dollar gehandelt wird, in der Wochenauswertung im Total-Ranking auf dem ersten Platz.
<img class="aligncenter wp-image-17092 size-full" src="https://insideparadeplatz.ch/wp-content/uploads/2015/03/Total-Ranking-6-Mar-2015.png" alt="Total-Ranking 6 Mar 2015" width="873" height="627" /></a></p>]]>
</content:encoded>
What I'm trying to do is , using beautifulsoup4, I'm able to extract 'title', 'link', 'pubDate'. But problem is 'content:encoded'. Here I want to extract 'img' from 'content:encoded' for my 'img_list'. I've tried many solutions but all I get is None.
title = []
link = []
date = []
img_list = []
for item in soup.find_all('item'):
for t in item.find_all('title'):
title.append(t.text)
for item in soup.find_all('item'):
for l in item.find_all('link'):
link.append(t.text)
for item in soup.find_all('item'):
for date in item.find_all('pubDate'):
pubDate.append(date.text)
for item in soup.find_all('item'):
for data in item.find_all('content:encoded'):
data.text
I tried:
for item in soup.find_all('item'):
for data in item.find_all('content:encoded'):
for img in data.find_all('img'):
img_list.append(img.text)
but got nothing. What I'm missing here?
I think your going to have trouble getting that img data out.
for item in soup.find("content:encoded"):
print(item)
print(type(item))
Then see: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#navigablestring
So bs4 thinks it is a string and you will need to parse it manually or maybe refeed the new string into a new bs4 object