decoding to ut8 not working python - python

I am trying to scrape some data from a website in german. The code is as follows:
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib2, requests
import time, sys
from selenium import webdriver
import os, sys
reload(sys)
sys.setdefaultencoding('utf-8')
chromedriver = "./chromedriver"
os.environ["webdriver.chrome.driver"] = chromedriver
URL = 'http://de.vroniplag.wikia.com/'
def gethtml(link):
req = urllib2.Request(link, headers={'User-Agent': "Magic Browser"})
con = urllib2.urlopen(req)
html = con.read()
return html
Soup = lambda x: BeautifulSoup(x, 'html.parser')
def getplagtags(url):
soup = Soup(gethtml(url))
frgtab = soup.find('table', attrs={'class': 'ueberpruefte-fragmentseiten'})
frgs = [e['href'] for e in frgtab.findAll('a') if e['href'] and 'Seite nicht vorhanden' not in e['title']]
lst=[]
driver = webdriver.Chrome(chromedriver)
print frgs
for frg in frgs[0:1]:
url=URL+frg[1:]
print url
driver.get(url)
for tag in driver.find_elements_by_css_selector('[class^=fragmark]'):
lst.append([tag.get_attribute('class'),tag.text.encode('utf-8')])
driver.quit()
print lst
getplagtags('http://de.vroniplag.wikia.com/wiki/Aaf')
The result is as follows:
[[u'fragmark1', 'Verursacher von Infektionen in Krankenh\xc3\xa4usern und'], [u'fragmark2', 'auch in der Bev\xc3\xb6lkerung.'], [u'fragmark3', 'zwei Jahre nach der'], [u'fragmark4', 'des semisynthetischen Penicillin Methicillin,'], [u'fragmark5', 'zur Behandlung von Penicillin-resistentem S. aureus'], [u'fragmark6', 'in einem Krankenhaus in Boston'], [u'fragmark7', 'im Jahr 2006 circa 19.000 Menschen an MRSA-Infektionen.'], [u'fragmark8', 'die Zahl der station\xc3\xa4r behandelten MRSA-Infektionen'], [u'fragmark9', 'zwischen 700 und 1.500 Personen an einer'], [u'fragmark1', 'Die Zahl der Infizierten'], [u'fragmark2', 'Mortalit\xc3\xa4t der Patienten durch schwerwiegende Erkrankungen wie'], [u'fragmark3', 'oder Staphylococcal Scaled Skin Syndrome.'], [u'fragmark4', 'Kosten f\xc3\xbcr das Gesundheitssystem.'], [u'fragmark5', 'in der gegenw\xc3\xa4rtigen Forschung'], [u'fragmark6', 'sind.'], [u'fragmark6', '1.1. Methicillin-resistenter'], [u'fragmark7', 'durch Resistenzen gegen\xc3\xbcber allen Betalaktamantibiotika'], [u'fragmark8', 'als minimale Oxacillin-Hemmkonzentration von \xe2\x89\xa5 4 \xce\xbcg/mL.'], [u'fragmark9', 'einem mobilen genetischen Element.'], [u'fragmark1', 'Durch den Repressor MecI und den Tranducer MecRi'], [u'fragmark2', 'bekannt. Das mecA-Gen kodiert f\xc3\xbcr ein'], [u'fragmark7', 'Jevons MP, Coe AW, Parker MT. Methicillin resistance in staphylococci. Lancet 1963; 1:904-907'], [u'fragmark3', 'Barber M. Methicillin resistant staphylococci. J Clin Path'], [u'fragmark4', 'Barrett FF, McGehee RF Jr, Finland M. Methicillin-resistant Staphylococcus aureus at Boston City Hospital. Bacteriologic and epidemiologic observations. N Engl J Med 1968; 279;441-448'], [u'fragmark1', 'Klevens et al.: Invasive Methicillin-Resistant Staphylococcus aureus Infections in the United States. JAMA 298/15/2007. S. 1763'], [u'fragmark8', 'Klein E, Smith DL, Laxmiranayan R. Hospitalizations and deaths caused by Methicillin-resistant Staphylococcus aureus, United States, 1999'], [u'fragmark9', 'Infect Dis 2007; 13(12):1840-1846'], [u'fragmark2', 'Noskin GA, Rubin RJ,'], [u'fragmark3', 'et al. The burden of Staphylococcus'], [u'fragmark4', 'on hospitals in the United States: an analysis of the 2000 and 2001 Nationwide'], [u'fragmark5', 'Sample Database. Arch Intern Med 2005; 165:1756-1761'], [u'fragmark5', 'Deurenberg RH, Stobberingh EE. The evolution of Staphylococcus aureus. Infect'], [u'fragmark6', 'Evol. 2008 Jul 29.'], [u'fragmark1', 'Verursacher von Infektionen in Krankenh\xc3\xa4usern und'], [u'fragmark2', 'auch in der Bev\xc3\xb6lkerung.'], [u'fragmark3', 'zwei Jahre nach der'], [u'fragmark4', 'des semisynthetischen Penicillin Methicillin'], [u'fragmark5', 'zur Behandlung von Penicillin-resistentem S. aureus'], [u'fragmark6', 'in einem Krankenhaus in Boston'], [u'fragmark7', 'im Jahr 2006 circa 19.000 Menschen an MRSA-Infektionen'], [u'fragmark8', 'die Zahl der station\xc3\xa4r behandelten MRSA-Infektionen'], [u'fragmark9', 'zwischen 700 und 1.500 Personen an einer'], [u'fragmark1', 'die Zahl der Infizierten'], [u'fragmark2', 'Mortalit\xc3\xa4t der Patienten durch schwerwiegende Erkrankungen wie'], [u'fragmark3', 'oder Staphylococcal Scaled Skin Syndrome'], [u'fragmark4', 'Kosten f\xc3\xbcr das Gesundheitssystem,'], [u'fragmark5', 'in der gegenw\xc3\xa4rtigen Forschung'], [u'fragmark6', 'sind.'], [u'fragmark6', '1.1 Methicillin-resistenter'], [u'fragmark7', 'durch Resistenzen gegen\xc3\xbcber allen Betalaktamantibiotika'], [u'fragmark8', 'als minimale Oxacillin-Hemmkonzentration von \xe2\x89\xa5 4 \xce\xbcg/mL.'], [u'fragmark9', 'einem mobilen genetischen Element,'], [u'fragmark1', 'durch den Repressor MecI und den Tranducer MecRi'], [u'fragmark2', 'bekannt. Das mecA-Gen kodiert f\xc3\xbcr ein'], [u'fragmark3', 'Barber M. Methicillin resistant staphylococci. J Clin Path'], [u'fragmark4', 'Barrett FF, McGehee RF Jr, Finland M. Methicillin-resistant Staphylococcus aureus at Boston City Hospital. Bacteriologic and epidemiologic observations. N Engl J Med 1968; 279;441-448'], [u'fragmark5', 'Deurenberg RH, Stobberingh EE. The evolution of Staphylococcus aureus. Infect'], [u'fragmark6', 'Evol. 2008 Jul 29'], [u'fragmark7', 'Jevons MP, Coe AW, Parker MT. Methicillin resistance in staphylococci. Lancet 1963; 1:904-907'], [u'fragmark8', 'Klein E, Smith DL, Laxmiranayan R. Hospitalizations and deaths caused by Methicillin-resistant Staphylococcus aureus, United States, 1999'], [u'fragmark9', 'Infect Dis 2007; 13(12):1840-1846'], [u'fragmark1', 'Klevens et al.: Invasive Methicillin-Resistant Staphylococcus aureus Infections in the United States. JAMA 298/15/2007. S. 1763'], [u'fragmark2', 'Noskin GA, Rubin RJ,'], [u'fragmark3', 'et al. The burden of Staphylococcus'], [u'fragmark4', 'on hospitals in the United States: an analysis of the 2000 and 2001 Nationwide'], [u'fragmark5', 'Sample Database. Arch Intern Med 2005; 165:1756- 1761']]
My question is why is the text in the result (the second element in each list) is not in unicode, despite the fact that I am using the encode function.
UPDATE:
Removed the setdefaultencoding and the encode function. Now I get the following result
[[u'fragmark1', u'Verursacher von Infektionen in Krankenh\xe4usern und'], [u'fragmark2', u'auch in der Bev\xf6lkerung.'], [u'fragmark3', u'zwei Jahre nach der'], [u'fragmark4', u'des semisynthetischen Penicillin Methicillin,'], [u'fragmark5', u'zur Behandlung von Penicillin-resistentem S. aureus'], [u'fragmark6', u'in einem Krankenhaus in Boston'], [u'fragmark7', u'im Jahr 2006 circa 19.000 Menschen an MRSA-Infektionen.'], [u'fragmark8', u'die Zahl der station\xe4r behandelten MRSA-Infektionen'], [u'fragmark9', u'zwischen 700 und 1.500 Personen an einer'], [u'fragmark1', u'Die Zahl der Infizierten'], [u'fragmark2', u'Mortalit\xe4t der Patienten durch schwerwiegende Erkrankungen wie'], [u'fragmark3', u'oder Staphylococcal Scaled Skin Syndrome.'], [u'fragmark4', u'Kosten f\xfcr das Gesundheitssystem.'], [u'fragmark5', u'in der gegenw\xe4rtigen Forschung'], [u'fragmark6', u'sind.'], [u'fragmark6', u'1.1. Methicillin-resistenter'], [u'fragmark7', u'durch Resistenzen gegen\xfcber allen Betalaktamantibiotika'], [u'fragmark8', u'als minimale Oxacillin-Hemmkonzentration von \u2265 4 \u03bcg/mL.'], [u'fragmark9', u'einem mobilen genetischen Element.'], [u'fragmark1', u'Durch den Repressor MecI und den Tranducer MecRi'], [u'fragmark2', u'bekannt. Das mecA-Gen kodiert f\xfcr ein'], [u'fragmark7', u'Jevons MP, Coe AW, Parker MT. Methicillin resistance in staphylococci. Lancet 1963; 1:904-907'], [u'fragmark3', u'Barber M. Methicillin resistant staphylococci. J Clin Path'], [u'fragmark4', u'Barrett FF, McGehee RF Jr, Finland M. Methicillin-resistant Staphylococcus aureus at Boston City Hospital. Bacteriologic and epidemiologic observations. N Engl J Med 1968; 279;441-448'], [u'fragmark1', u'Klevens et al.: Invasive Methicillin-Resistant Staphylococcus aureus Infections in the United States. JAMA 298/15/2007. S. 1763'], [u'fragmark8', u'Klein E, Smith DL, Laxmiranayan R. Hospitalizations and deaths caused by Methicillin-resistant Staphylococcus aureus, United States, 1999'], [u'fragmark9', u'Infect Dis 2007; 13(12):1840-1846'], [u'fragmark2', u'Noskin GA, Rubin RJ,'], [u'fragmark3', u'et al. The burden of Staphylococcus'], [u'fragmark4', u'on hospitals in the United States: an analysis of the 2000 and 2001 Nationwide'], [u'fragmark5', u'Sample Database. Arch Intern Med 2005; 165:1756-1761'], [u'fragmark5', u'Deurenberg RH, Stobberingh EE. The evolution of Staphylococcus aureus. Infect'], [u'fragmark6', u'Evol. 2008 Jul 29.'], [u'fragmark1', u'Verursacher von Infektionen in Krankenh\xe4usern und'], [u'fragmark2', u'auch in der Bev\xf6lkerung.'], [u'fragmark3', u'zwei Jahre nach der'], [u'fragmark4', u'des semisynthetischen Penicillin Methicillin'], [u'fragmark5', u'zur Behandlung von Penicillin-resistentem S. aureus'], [u'fragmark6', u'in einem Krankenhaus in Boston'], [u'fragmark7', u'im Jahr 2006 circa 19.000 Menschen an MRSA-Infektionen'], [u'fragmark8', u'die Zahl der station\xe4r behandelten MRSA-Infektionen'], [u'fragmark9', u'zwischen 700 und 1.500 Personen an einer'], [u'fragmark1', u'die Zahl der Infizierten'], [u'fragmark2', u'Mortalit\xe4t der Patienten durch schwerwiegende Erkrankungen wie'], [u'fragmark3', u'oder Staphylococcal Scaled Skin Syndrome'], [u'fragmark4', u'Kosten f\xfcr das Gesundheitssystem,'], [u'fragmark5', u'in der gegenw\xe4rtigen Forschung'], [u'fragmark6', u'sind.'], [u'fragmark6', u'1.1 Methicillin-resistenter'], [u'fragmark7', u'durch Resistenzen gegen\xfcber allen Betalaktamantibiotika'], [u'fragmark8', u'als minimale Oxacillin-Hemmkonzentration von \u2265 4 \u03bcg/mL.'], [u'fragmark9', u'einem mobilen genetischen Element,'], [u'fragmark1', u'durch den Repressor MecI und den Tranducer MecRi'], [u'fragmark2', u'bekannt. Das mecA-Gen kodiert f\xfcr ein'], [u'fragmark3', u'Barber M. Methicillin resistant staphylococci. J Clin Path'], [u'fragmark4', u'Barrett FF, McGehee RF Jr, Finland M. Methicillin-resistant Staphylococcus aureus at Boston City Hospital. Bacteriologic and epidemiologic observations. N Engl J Med 1968; 279;441-448'], [u'fragmark5', u'Deurenberg RH, Stobberingh EE. The evolution of Staphylococcus aureus. Infect'], [u'fragmark6', u'Evol. 2008 Jul 29'], [u'fragmark7', u'Jevons MP, Coe AW, Parker MT. Methicillin resistance in staphylococci. Lancet 1963; 1:904-907'], [u'fragmark8', u'Klein E, Smith DL, Laxmiranayan R. Hospitalizations and deaths caused by Methicillin-resistant Staphylococcus aureus, United States, 1999'], [u'fragmark9', u'Infect Dis 2007; 13(12):1840-1846'], [u'fragmark1', u'Klevens et al.: Invasive Methicillin-Resistant Staphylococcus aureus Infections in the United States. JAMA 298/15/2007. S. 1763'], [u'fragmark2', u'Noskin GA, Rubin RJ,'], [u'fragmark3', u'et al. The burden of Staphylococcus'], [u'fragmark4', u'on hospitals in the United States: an analysis of the 2000 and 2001 Nationwide'], [u'fragmark5', u'Sample Database. Arch Intern Med 2005; 165:1756- 1761']]

You decode from str to unicode and encode from unicode to str. tag.text.encode('utf-8') obviously gives you exactly what you asked for, just call tag.text as you already have a unicode string:
[tag.get_attribute('class'),tag.text]
Also avoid reload(sys) and sys.setdefaultencoding('utf-8'), why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script

Related

How to scrape and concate text in <br> tags with Beautiful Soup

I want to scrape parts of this site:
https://www.booklooker.de/B%C3%BCcher/Bastian-Sick+Der-Dativ-ist-dem-Genitiv-sein-Tod-Ein-Wegweiser-durch-den-Irrgarten-der-deutschen/id/A02ArCkS01ZZy
More accurate this part:
The html looks like this:
I tried this, but it doesn`t work:
from bs4 import BeautifulSoup
import requests
page = requests.get("https://www.booklooker.de/Bücher/Bastian-Sick+Der-Dativ-ist-dem-Genitiv-sein-Tod-Ein-Wegweiser-durch-den-Irrgarten-der-deutschen/id/A02ArCkS01ZZy")
souped = BeautifulSoup(page.content, "html.parser")
description = souped.find(class_="propertyItem_13").find_all("br").text
But that doesn`t work. Do you have any idea, how it is possible to scrape all the text?
Thanks in advance!!
If you just use the separator argument of get_text
print(souped.find(class_="propertyItem_13").get_text('\n').strip())
you'll get
Beschreibung:
Zustand siehe Bild. Zusätzlich: Ecken und Kanten leicht bestoßen. Seiten und Buchschnitt altersbedingt leicht verfärbt. Buchschnitt fleckig, siehe Bilder. Ab der Hälfte des Buches sind die Seiten oben leicht gebogen.
Die deutsche Sprache kennt zwar nur vier Fälle, dafür aber über tausend Zweifelsfälle. Heißt es Pizzas oder Pizzen? Gewinkt oder gewunken? Wann schreibt man Storys und wann Stories? Hat der Genitiv noch eine Chance — trotz des Dativs und dem Dativ zum Trotz?
Dieses Buch präsentiert die großartige SPIEGEL¬ONLINE-Kolumne »Zwiebelfisch«, die Woche für Woche Leser amüsiert, schockiert, belehrt und begeistert.
»Man spürt das Vergnügen, das der Umgang mit gutem Deutsch bereitet.« FAZ
»Wo der Duden nicht weiter weiß, weiß Sick Rat.« Saarbrücker Zeitung
Über das Buch:
Die oder das Nutella — diese Frage hat schon viele Gemüter am Frühstückstisch bewegt. Der, die, das — wieso, weshalb, warum? Ob Nutella nun weiblich oder sächlich ist, ist sicherlich keine Frage auf Leben und Tod, aber eine Antwort hätten wir schon gern. Wir? Ja, wir hilflos Verlorenen im Labyrinth der deutschen Sprache. Wir, die wir unsere liebe Not mit der deutschen Sprache haben. Und leichter, verständlicher oder zumindest nachvollziehbarer ist es nach der Rechtschreibreform auch nicht geworden.
In seinen hinreißend komischen und immer klugen Kolumnen bringt Bastian Sick Licht ins Dunkel der deutschen Sprachregelungen und sortiert den Sprachmüll. Ist der inflationären Verwendung von Binde-strichen noch Einhalt zu gebieten, angesichts von Spar-Plänen und Quoten-Druck? Versinken wir sprachlich gesehen nicht längst im Hagel der Apostrophe, wenn Känguru's plötzlich in den Weiten Australien's leben? Derlei Unsinn scheint nicht mehr aufhaltbar, wenn es nicht dieses Buch gäbe. Darauf zwei Espressis!
Der Autor:
Bastian Sick, Jahrgang 1965, Studium der Geschichtswissenschaft und Romanistik, Tätigkeit als Lektor und Übersetzer; von 1995-1998 Dokumentationsjournalist beim SPIEGEL-Verlag, ab Januar 1999 Mitarbeiter der Redaktion von SPIEGEL ONLINE. Seit Mai 2003 dort Autor der Kolumne »Zwiebelfisch«.
But if you want to target the <br>s specifically, you can copy this function into your code and use it like
print(html_to_text(souped.find(class_="propertyItem_13"))[1])
and that will give you
Beschreibung:Zustand siehe Bild. Zusätzlich: Ecken und Kanten leicht bestoßen. Seiten und Buchschnitt altersbedingt leicht verfärbt. Buchschnitt fleckig, siehe Bilder. Ab der Hälfte des Buches sind die Seiten oben leicht gebogen.
Die deutsche Sprache kennt zwar nur vier Fälle, dafür aber über tausend Zweifelsfälle. Heißt es Pizzas oder Pizzen? Gewinkt oder gewunken? Wann schreibt man Storys und wann Stories? Hat der Genitiv noch eine Chance — trotz des Dativs und dem Dativ zum Trotz?
Dieses Buch präsentiert die großartige SPIEGEL¬ONLINE-Kolumne »Zwiebelfisch«, die Woche für Woche Leser amüsiert, schockiert, belehrt und begeistert.
»Man spürt das Vergnügen, das der Umgang mit gutem Deutsch bereitet.« FAZ
»Wo der Duden nicht weiter weiß, weiß Sick Rat.« Saarbrücker Zeitung
Über das Buch:
Die oder das Nutella — diese Frage hat schon viele Gemüter am Frühstückstisch bewegt. Der, die, das — wieso, weshalb, warum? Ob Nutella nun weiblich oder sächlich ist, ist sicherlich keine Frage auf Leben und Tod, aber eine Antwort hätten wir schon gern. Wir? Ja, wir hilflos Verlorenen im Labyrinth der deutschen Sprache. Wir, die wir unsere liebe Not mit der deutschen Sprache haben. Und leichter, verständlicher oder zumindest nachvollziehbarer ist es nach der Rechtschreibreform auch nicht geworden.
In seinen hinreißend komischen und immer klugen Kolumnen bringt Bastian Sick Licht ins Dunkel der deutschen Sprachregelungen und sortiert den Sprachmüll. Ist der inflationären Verwendung von Binde-strichen noch Einhalt zu gebieten, angesichts von Spar-Plänen und Quoten-Druck? Versinken wir sprachlich gesehen nicht längst im Hagel der Apostrophe, wenn Känguru's plötzlich in den Weiten Australien's leben? Derlei Unsinn scheint nicht mehr aufhaltbar, wenn es nicht dieses Buch gäbe. Darauf zwei Espressis!
Der Autor:
Bastian Sick, Jahrgang 1965, Studium der Geschichtswissenschaft und Romanistik, Tätigkeit als Lektor und Übersetzer; von 1995-1998 Dokumentationsjournalist beim SPIEGEL-Verlag, ab Januar 1999 Mitarbeiter der Redaktion von SPIEGEL ONLINE. Seit Mai 2003 dort Autor der Kolumne »Zwiebelfisch«.
In this case , the difference is barely noticeable, but if you had more tags, you'd definitely notice that the first method spaces out everything, not just br; but if this is all you need it for, then the first method is much simpler.
You can just invoke the get_text() method to grab the entire description
from bs4 import BeautifulSoup
import requests
page = requests.get("https://www.booklooker.de/Bücher/Bastian-Sick+Der-Dativ-ist-dem-Genitiv-sein-Tod-Ein-Wegweiser-durch-den-Irrgarten-der-deutschen/id/A02ArCkS01ZZy")
souped = BeautifulSoup(page.content, "html.parser")
description = souped.find(class_="propertyItem_13").get_text(strip=True)
print(description)
Output:
Beschreibung:Zustand siehe Bild. Zusätzlich: Ecken und Kanten leicht bestoßen. Seiten und Buchschnitt altersbedingt
leicht verfärbt. Buchschnitt fleckig, siehe Bilder. Ab der Hälfte des Buches sind die Seiten oben leicht gebogen.Die deutsche Sprache kennt zwar nur vier Fälle, dafür aber über tausend Zweifelsfälle. Heißt es Pizzas oder Pizzen? Gewinkt oder gewunken? Wann schreibt man Storys und wann Stories? Hat der Genitiv noch eine Chance — trotz des Dativs und dem Dativ zum Trotz?Dieses Buch präsentiert die großartige SPIEGEL¬ONLINE-Kolumne »Zwiebelfisch«, die Woche für Woche Leser amüsiert, schockiert, belehrt und begeistert.»Man spürt das Vergnügen, das der Umgang mit gutem Deutsch bereitet.« FAZ»Wo der Duden nicht weiter weiß, weiß Sick Rat.« Saarbrücker ZeitungÜber das Buch:Die oder das Nutella
— diese Frage hat schon viele Gemüter am Frühstückstisch bewegt. Der, die, das — wieso, weshalb, warum? Ob Nutella nun weiblich oder sächlich ist, ist sicherlich keine Frage auf Leben und Tod, aber eine Antwort hätten wir schon gern. Wir? Ja, wir hilflos Verlorenen im Labyrinth der deutschen Sprache. Wir, die wir unsere liebe Not mit der deutschen Sprache haben. Und leichter, verständlicher oder zumindest nachvollziehbarer ist es nach der Rechtschreibreform auch nicht geworden.In seinen hinreißend komischen und immer klugen Kolumnen bringt Bastian Sick Licht ins Dunkel der
deutschen Sprachregelungen und sortiert den Sprachmüll. Ist der inflationären Verwendung von Binde-strichen noch Einhalt zu gebieten, angesichts von Spar-Plänen und Quoten-Druck? Versinken wir sprachlich gesehen nicht längst im Hagel der Apostrophe, wenn Känguru's plötzlich in den Weiten Australien's leben? Derlei Unsinn scheint nicht mehr aufhaltbar, wenn es nicht dieses Buch gäbe. Darauf zwei Espressis!Der Autor:Bastian Sick, Jahrgang 1965, Studium der Geschichtswissenschaft und Romanistik, Tätigkeit als Lektor und Übersetzer; von 1995-1998 Dokumentationsjournalist beim SPIEGEL-Verlag, ab Januar 1999 Mitarbeiter der Redaktion von SPIEGEL ONLINE. Seit Mai 2003 dort Autor der Kolumne »Zwiebelfisch«.
The text isn't in a <br> tag. You need to get text from PropertyValue
Your code doesn't return any results, because the <br> does not contain any tags. In fact, the tag does not support ending tags and can only be closed at opening: <br/>. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br
You might want to use the get_text method: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#get-text

How to loop through website with BeautifulSoup?

I want to loop through this site and click on each book-element in the list. That means for this example first on:
Leo Lausemaus will nicht teilen Pixi ...
Löcher - Die Geheimnisse von Green Lake
...
In the marked part of the HTML file is an <a> thats href takes you to the page I want to go to first:
With BeautifulSoup I am able to extract that part of the code, where the <a> is.
from bs4 import BeautifulSoup
import requests
page = requests.get(https://www.booklooker.de/buecher-schnaeppchen)
souped = BeautifulSoup(page.content, "html.parser")
test = souped.find_all(class_="resultList_desc")
for i in test:
result = i.find('a')
Here is the result from the code:
<span class="artikeltitel notranslate" id="ID2365796060">Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus</span>
<span class="artikeltitel notranslate" id="ID2367131489">Löcher - Die Geheimnisse von Green Lake</span>
<span class="artikeltitel notranslate" id="ID2366667608">Die Wanderhure</span>
...
After that I want to click on each element in the list to get to the respective page that is stored in the href attribute.
This part is my problem. I don't know how to get to the wepages from this list.
You are close to your goal, simply iterate your list and .get('href') from your <a>s to request the detail pages - I worked with css selectors for convenience here to select each item and used the value of href attribute concatinated with the base url:
for e in soup.select('[id^="article_"]'):
soup_p = BeautifulSoup(requests.get('https://www.booklooker.de/'+e.a.get('href')).text)
The scraped contents ar stored as dict in a list
data.append({
'title':soup_p.h1.text
})
Example
from bs4 import BeautifulSoup
import requests
page = requests.get('https://www.booklooker.de/buecher-schnaeppchen')
soup = BeautifulSoup(page.content)
data = []
for e in soup.select('[id^="article_"]'):
soup_p = BeautifulSoup(requests.get('https://www.booklooker.de/'+e.a.get('href')).content)
d = {
'title':soup_p.h1.text,
'whatever': 'should be scraped'
}
d.update(dict([x.strip() for x in row.text.split(':', 1)] for row in soup_p.select('table.articleDetails tr:not(:has(td[colspan]))')))
data.append(d)
data
Output
[{'title': 'Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus – Buch gebraucht kaufen', 'whatever': 'should be scraped', 'Autor/in': 'Anna Casalis (Originaltext), Marco Campanella (Illustrationen)', 'Titel': 'Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus', 'ISBN': '9783551050519 (ISBN-10: 3551050511)', 'Zustand': 'wie neu', 'Verlag': 'Carlsen Verlag GmbH', 'Format': '10 x 10 cm', 'Seiten': '24', 'Gewicht': '20\xa0g', 'Ort': 'Hamburg', 'Auflage': '2. Auflage 2014', 'Erschienen': 'c2013', 'Einband': 'Taschenbuch', 'Sprache': 'Deutsch', 'Beschreibung': 'Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus, Carlsen Verlag GmbH c2013, 2. Auflage 2014, Minibuch, Originalfoto, sehr gut erhalten und fast wie neu mit minimalen Gebrauchsspuren, minimal angestoßen, keine Einträge, schneller Versand nach Zahlungseingang!', 'Verlagstext': 'Neun Jahre währt nun der Siegeszug von Leo Lausemaus in deutschen Kinderzimmern. Über eine Million Mal haben sich die Geschichten in dieser Zeit verkauft. Das Erfolgsgeheimnis: Leo Lausemaus greift die großen Themen des Kindergartenaltes auf und setzt sich dabei behutsam und liebevoll mit den typischen Konfliktsituationen auseinander.', 'Stichwörter': 'Ab 3 Jahren, Bilderbücher, Billige Bücher, Erste Bücher, Geschenke Kinder, Kinderbuch, Kindergeschichten, Minibuch, Pixie, Vorlesebuch', 'Bestell-Nr.': 'BN14133', 'Sparte': 'Bücher: Kinderbücher / Jugendbücher: Pixi-Bücher>> Mehr von diesem Verkäufer in dieser Sparte>> Mehr von diesem Verkäufer von diesem Autor>> Alle Sparten dieses Verkäufers'}, {'title': 'Löcher - Die Geheimnisse von Green Lake – Buch gebraucht kaufen', 'whatever': 'should be scraped', 'Autor/in': 'Louis Sachar', 'Titel': 'Löcher - Die Geheimnisse von Green Lake', 'ISBN': '9783407740984 (ISBN-10: 3407740980)', 'Zustand': 'wie neu', 'Verlag': 'Julius Beltz GmbH & Co. KG', 'Format': '187x125x17 mm', 'Seiten': '296', 'Gewicht': '295\xa0g', 'Einband': 'Taschenbuch', 'Sprache': 'Deutsch', 'Beschreibung': 'Tierfreier Nichtraucher-Haushalt Versand als Bücher-/Warensendung', 'Verlagstext': 'Schon der Anfang ist unglaublich: Stanley Yelnats geht nichts ahnend unter einer Brücke durch, als ihm die riesigen, übel riechenden Turnschuhe eines berühmten Baseballspielers auf den Kopf fallen. Und weil sein Vater an einem bahnbrechenden Recycling-Verfahren mit gebrauchten Turnschuhen arbeitet, hält Stanley die müffelnden Treter für ein Zeichen und nimmt sie mit. Pech, dass die Polizei schon nach dem Dieb sucht. Der Jugendrichter lässt Stanley die Wahl: Jugendgefängnis oder 18 Monate Camp Green Lake. Er entscheidet sich für das Camp. Die Hitze dort ist unerträglich, der Alltag hart, doch so schnell gibt Stanley nicht auf.', 'Angebot vom': '25.08.2022', 'Bestell-Nr.': 'BN0098', 'Sparte': 'Bücher: Kinderbücher / Jugendbücher: Jugendbuch allgemein>> Mehr von diesem Verkäufer in dieser Sparte>> Mehr von diesem Verkäufer von diesem Autor>> Alle Sparten dieses Verkäufers'},...]
data converted to DataFrame:
import pandas as pd
pd.DataFrame(data)
title
whatever
Autor/in
Titel
ISBN
Zustand
Verlag
Format
Seiten
Gewicht
Ort
Auflage
Erschienen
Einband
Sprache
Beschreibung
Verlagstext
Stichwörter
Bestell-Nr.
Sparte
Angebot vom
Lieferzeit
0
Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus – Buch gebraucht kaufen
should be scraped
Anna Casalis (Originaltext), Marco Campanella (Illustrationen)
Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus
9783551050519 (ISBN-10: 3551050511)
wie neu
Carlsen Verlag GmbH
10 x 10 cm
24
20 g
Hamburg
2. Auflage 2014
c2013
Taschenbuch
Deutsch
Leo Lausemaus will nicht teilen Pixi Buch Nr. 1987 Einzeltitel aus Pixi Serie 219 Leo Lausemaus, Carlsen Verlag GmbH c2013, 2. Auflage 2014, Minibuch, Originalfoto, sehr gut erhalten und fast wie neu mit minimalen Gebrauchsspuren, minimal angestoßen, keine Einträge, schneller Versand nach Zahlungseingang!
Neun Jahre währt nun der Siegeszug von Leo Lausemaus in deutschen Kinderzimmern. Über eine Million Mal haben sich die Geschichten in dieser Zeit verkauft. Das Erfolgsgeheimnis: Leo Lausemaus greift die großen Themen des Kindergartenaltes auf und setzt sich dabei behutsam und liebevoll mit den typischen Konfliktsituationen auseinander.
Ab 3 Jahren, Bilderbücher, Billige Bücher, Erste Bücher, Geschenke Kinder, Kinderbuch, Kindergeschichten, Minibuch, Pixie, Vorlesebuch
BN14133
Bücher: Kinderbücher / Jugendbücher: Pixi-Bücher>> Mehr von diesem Verkäufer in dieser Sparte>> Mehr von diesem Verkäufer von diesem Autor>> Alle Sparten dieses Verkäufers
nan
nan
1
Löcher - Die Geheimnisse von Green Lake – Buch gebraucht kaufen
should be scraped
Louis Sachar
Löcher - Die Geheimnisse von Green Lake
9783407740984 (ISBN-10: 3407740980)
wie neu
Julius Beltz GmbH & Co. KG
187x125x17 mm
296
295 g
nan
nan
nan
Taschenbuch
Deutsch
Tierfreier Nichtraucher-Haushalt
Schon der Anfang ist unglaublich: Stanley Yelnats geht nichts ahnend unter einer Brücke durch, als ihm die riesigen, übel riechenden Turnschuhe eines berühmten Baseballspielers auf den Kopf fallen. Und weil sein Vater an einem bahnbrechenden Recycling-Verfahren mit gebrauchten Turnschuhen arbeitet, hält Stanley die müffelnden Treter für ein Zeichen und nimmt sie mit. Pech, dass die Polizei schon nach dem Dieb sucht. Der Jugendrichter lässt Stanley die Wahl: Jugendgefängnis oder 18 Monate Camp Green Lake. Er entscheidet sich für das Camp. Die Hitze dort ist unerträglich, der Alltag hart, doch so schnell gibt Stanley nicht auf.
nan
BN0098
Bücher: Kinderbücher / Jugendbücher: Jugendbuch allgemein>> Mehr von diesem Verkäufer in dieser Sparte>> Mehr von diesem Verkäufer von diesem Autor>> Alle Sparten dieses Verkäufers
25.08.2022
nan
2
Die Wanderhure – Buch gebraucht kaufen
should be scraped
Iny Lorentz
Die Wanderhure
3426629348 (ISBN-13: 9783426629345)
leichte Gebrauchsspuren
Knaur Taschenbuch
190x125x39 mm
624
452 g
nan
nan
2005
Taschenbuch
Deutsch
Das Buch ist in einem guten Zustand und weist nur leichte Gebrauchsspuren auf. "Konstanz im Jahre 1410: Als Graf Ruppert um die Hand der schönen Bürgerstochter Marie anhält, kann ihr Vater der schönen Bürgerstochter Marie abhält, kann ihr Vater sein Glück kaum fassen. Er ahnt nicht, dass es dem adeligen Bewerber nur um das Vermögen seiner zukünftigen Frau geht und dass er dafür vor keinem Verbrechen zurückschreckt."Privatverkauf daher kein Rückgaberecht
Eine Frau kämpft in der grausamen Welt des Mittelalters um ihr Glück. Konstanz im Jahre 1410: Als Graf Ruppert um die Hand der schönen Bürgerstochter Marie anhält, kann ihr Vater sein Glück kaum fassen. Er ahnt nicht, dass es dem adligen Bewerber nur um das Vermögen seiner künftigen Frau geht und dass er dafür vor keinem Verbrechen zurückscheut. Marie und ihr Vater werden Opfer einer gemeinen Intrige, die das Mädchen zur Stadt hinaustreibt. Um zu überleben, muss sie ihren Körper verkaufen. Aber Marie gibt nicht auf ... Alle Bände der historischen Bestseller-Reihe rund um Marie Adler von Iny Lorentz in chronologischer Reihenfolge:• Die Wanderhure• Die Kastellanin• Das Vermächtnis der Wanderhure• Die List der Wanderhure• Die Wanderhure und die Nonne• Die Wanderhure und der orientalische Arzt• Die Tochter der Wanderhure• Töchter der Sünde• Die Wanderhure und der orientalische Arzt
Huren, Intrige, Konstanz, Marie Schärer, Marie Adler, Bürgerstochter, Ruppertus Splendidus, Grafensohn, Verdächtigung, Hübschlerin, Wanderschaft, Wanderhure, Konstanzer Konzil, Rache, Aufstand, Iny Lorentz Romane, historische Romane Mittelalter
BN00214
Bücher: Romane / Erzählungen: Historische Romane>> Mehr von diesem Verkäufer in dieser Sparte>> Mehr von diesem Verkäufer von diesem Autor>> Alle Sparten dieses Verkäufers
21.08.2022
nan

pandas read_csv() with BOM fails with "unexpected end of file"

I receive a BOM-encoded file as an http request parameter and I want to parse it using read_csv but I get the following error when using engine='c':
{ParserError}Error tokenizing data. C error: EOF inside string starting at row 8
If using engine='python', this is what I get:
{ParserError}unexpected end of data
This is the code:
df = pd.read_csv(BytesIO(file_data), engine='c')
I tried doing decode('utf-8-sig') and then encode('utf-8') but it doesn't work and I get the same error.
How to fix this?
Attached file below:
,source,reference,Yandex Cloud Translate API v2 (stock)
0,"Find links about healthcare / medicines, hospitals in Budapest and a lot more in The links of expatriation.","Finden Sie Verbindungen gesundheit / krankenhaus, apotheke und arzneimittel in Budapest und vieles mehr unter Verzeichnis für Expatriation.","Finden Sie links über Gesundheitswesen / Medikamente, Krankenhäuser in Budapest und vieles mehr in den links von expatriation."
1,"Important for formal obligations for visitors in Schorndorf: Health insurance It's also necessary, that your visitor /guest issues a certificate of a health insurance to the Ausländeramt in Schorndorf.","Wichtig bei der Verpflichtungserklärung für Besucher in Schorndorf: Krankenversicherung Darüber hinaus ist es regelmäßig erforderlich, dass Ihr Gast den Abschluss einer Auslandskrankenversicherung der/dem Ausländeramt in Schorndorf nachweist.","Wichtig für formelle Verpflichtungen für Besucher in Schorndorf: Krankenversicherung es ist auch notwendig, dass Ihr Besucher / Gast beim Ausländeramt in Schorndorf eine krankenversicherungsbescheinigung ausstellt."
2,"If you think you are having any difficulty with your hearing, you should visit your doctor or healthcare professional as soon as possible.","Wenn Sie Schwierigkeiten mit dem Gehör haben, dann sollten Sie so schnell wie möglich einen Arzt oder Hörgeräteakustiker aufsuchen.","Wenn Sie denken, dass Sie Schwierigkeiten mit Ihrem Gehör haben, sollten Sie Ihren Arzt oder Arzt so schnell wie möglich besuchen."
3,This most important fair on the African continent for scientific and medical instruments took place in Johannesburg in South Africa in the Kyalami Exhibition Centre Midrand.,Diese wichtigste Messe auf dem afrikanischen Kontinent für wisschenschaftliche und medizinische Geräte fand in Johannesburg in Südafrika im Kyalami Exhibition Centre Midrand statt.,Diese wichtigste Messe auf dem afrikanischen Kontinent für wissenschaftliche und medizinische Instrumente fand in Johannesburg in Südafrika im Kyalami Exhibition Centre Midrand statt.
4,"Generally these negative effects do not occur; nevertheless, an improper dose of Semenax consumption could bring about some undesirable health concerns.",Normalerweise nicht passieren diese Nebenwirkungen; Dennoch kann eine falsche Dosis von Semenax Verbrauch zu einigen unerwünschten gesundheitlichen Bedenken führen.,Im Allgemeinen treten diese negativen Effekte nicht auf; dennoch könnte eine unsachgemäße Dosis von Semenax-Konsum zu einigen unerwünschten gesundheitlichen Bedenken führen.
5,"We do not accept any other definition that infers abortion to be within this term; and furthermore we understand that any care, information, policies or any other services pertaining to sexual and reproductive health similarly exclude abortion.","Wir akzeptieren keine andere Definition, die die Abtreibung in diesen Terminus einschließt; und weiter gehen wir davon aus, dass jede Betreuung, Information, Maßnahme oder andere Dienstleistung im Zusammenhang mit sexueller und reproduktiver Gesundheit ebenfalls die Abtreibung ausschließen.","Wir akzeptieren keine andere definition, die Abtreibung in diesem Begriff bezeichnet; und wir verstehen darüber hinaus, dass jegliche Sorge, information, Politik oder andere Dienstleistungen im Zusammenhang mit sexueller und reproduktiver Gesundheit Abtreibung ebenfalls ausschließen."
6,"So far, studies on the long-term health effects of the exposure of this population have not been undertaken.The total number of people affected by radioactive contamination may never be known.","Studien bezüglich der gesundheitlichen Auswirkungen der radioaktiven Verseuchung wurden bislang nicht durchgeführt.Wie viele Menschen von der Strahlung am Schluss betroffen sein werden, wird wohl nie bekannt werden.","Bisher wurden keine Studien über die langfristigen gesundheitlichen Auswirkungen der Exposition dieser Bevölkerung durchgeführt.Wie viele Menschen von der radioaktiven Kontamination betroffen sind, ist nicht bekannt."
7,"And people on the lower end of the economic spectrum tend to have a lower health status, hence lower blood quality with a higher risk for diseases like hepatitis.","Und Personen aus dem unteren Ende des ökonomischen Spektrums tendieren dazu, einen schlechteren Gesundheitszustand zu haben und damit eine geringere Blutqualität mit einem höheren Risiko für Krankheiten wie Hepatitis.","Und Menschen am unteren Ende des ökonomischen Spektrums neigen dazu, einen niedrigeren Gesundheitsstatus zu haben, daher niedrigere blutqualität mit einem höheren Risiko für Krankheiten wie hepatitis
The error identifies an actual problem. Besides, BOM isn't an encoding, it's just a few bytes at the start of the file that specify the type of UTF encoding used.
Text fields are quoted but the last one has no closing quote. Parsing would fail even if the data was a string in memory:
csv=''',source,reference,Yandex Cloud Translate API v2 (stock)
0,"Find links about healthcare / medicines, hospitals in Budapest and a lot more in The links of expatriation.","Finden Sie Verbindungen gesundheit / krankenhaus, apotheke und arzneimittel in Budapest und vieles mehr unter Verzeichnis für Expatriation.","Finden Sie links über Gesundheitswesen / Medikamente, Krankenhäuser in Budapest und vieles mehr in den links von expatriation."
1,"Important for formal obligations for visitors in Schorndorf: Health insurance It's also necessary, that your visitor /guest issues a certificate of a health insurance to the Ausländeramt in Schorndorf.","Wichtig bei der Verpflichtungserklärung für Besucher in Schorndorf: Krankenversicherung Darüber hinaus ist es regelmäßig erforderlich, dass Ihr Gast den Abschluss einer Auslandskrankenversicherung der/dem Ausländeramt in Schorndorf nachweist.","Wichtig für formelle Verpflichtungen für Besucher in Schorndorf: Krankenversicherung es ist auch notwendig, dass Ihr Besucher / Gast beim Ausländeramt in Schorndorf eine krankenversicherungsbescheinigung ausstellt."
2,"If you think you are having any difficulty with your hearing, you should visit your doctor or healthcare professional as soon as possible.","Wenn Sie Schwierigkeiten mit dem Gehör haben, dann sollten Sie so schnell wie möglich einen Arzt oder Hörgeräteakustiker aufsuchen.","Wenn Sie denken, dass Sie Schwierigkeiten mit Ihrem Gehör haben, sollten Sie Ihren Arzt oder Arzt so schnell wie möglich besuchen."
3,This most important fair on the African continent for scientific and medical instruments took place in Johannesburg in South Africa in the Kyalami Exhibition Centre Midrand.,Diese wichtigste Messe auf dem afrikanischen Kontinent für wisschenschaftliche und medizinische Geräte fand in Johannesburg in Südafrika im Kyalami Exhibition Centre Midrand statt.,Diese wichtigste Messe auf dem afrikanischen Kontinent für wissenschaftliche und medizinische Instrumente fand in Johannesburg in Südafrika im Kyalami Exhibition Centre Midrand statt.
4,"Generally these negative effects do not occur; nevertheless, an improper dose of Semenax consumption could bring about some undesirable health concerns.",Normalerweise nicht passieren diese Nebenwirkungen; Dennoch kann eine falsche Dosis von Semenax Verbrauch zu einigen unerwünschten gesundheitlichen Bedenken führen.,Im Allgemeinen treten diese negativen Effekte nicht auf; dennoch könnte eine unsachgemäße Dosis von Semenax-Konsum zu einigen unerwünschten gesundheitlichen Bedenken führen.
5,"We do not accept any other definition that infers abortion to be within this term; and furthermore we understand that any care, information, policies or any other services pertaining to sexual and reproductive health similarly exclude abortion.","Wir akzeptieren keine andere Definition, die die Abtreibung in diesen Terminus einschließt; und weiter gehen wir davon aus, dass jede Betreuung, Information, Maßnahme oder andere Dienstleistung im Zusammenhang mit sexueller und reproduktiver Gesundheit ebenfalls die Abtreibung ausschließen.","Wir akzeptieren keine andere definition, die Abtreibung in diesem Begriff bezeichnet; und wir verstehen darüber hinaus, dass jegliche Sorge, information, Politik oder andere Dienstleistungen im Zusammenhang mit sexueller und reproduktiver Gesundheit Abtreibung ebenfalls ausschließen."
6,"So far, studies on the long-term health effects of the exposure of this population have not been undertaken.The total number of people affected by radioactive contamination may never be known.","Studien bezüglich der gesundheitlichen Auswirkungen der radioaktiven Verseuchung wurden bislang nicht durchgeführt.Wie viele Menschen von der Strahlung am Schluss betroffen sein werden, wird wohl nie bekannt werden.","Bisher wurden keine Studien über die langfristigen gesundheitlichen Auswirkungen der Exposition dieser Bevölkerung durchgeführt.Wie viele Menschen von der radioaktiven Kontamination betroffen sind, ist nicht bekannt."
7,"And people on the lower end of the economic spectrum tend to have a lower health status, hence lower blood quality with a higher risk for diseases like hepatitis.","Und Personen aus dem unteren Ende des ökonomischen Spektrums tendieren dazu, einen schlechteren Gesundheitszustand zu haben und damit eine geringere Blutqualität mit einem höheren Risiko für Krankheiten wie Hepatitis.","Und Menschen am unteren Ende des ökonomischen Spektrums neigen dazu, einen niedrigeren Gesundheitsstatus zu haben, daher niedrigere blutqualität mit einem höheren Risiko für Krankheiten wie hepatitis'''
Trying to read this throws :
from io import StringIO
import pandas as pd
df=pd.read_csv(StringIO(csv))
>>> ...
>>> pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at row 8
The last field in row 8 has a start but no end quote :
"Und Menschen am unteren Ende des ökonomischen Spektrums neigen dazu, einen niedrigeren Gesundheitsstatus zu haben, daher niedrigere blutqualität mit einem höheren Risiko für Krankheiten wie hepatitis
Once the missing quote is added, the file can be parsed:
>>> df=pd.read_csv(StringIO(csv+'"')
>>> df.columns
Index(['Unnamed: 0', 'source', 'reference',
'Yandex Cloud Translate API v2 (stock)'],
dtype='object')
Another quirk is that the first column has no name. Pandas reads it as Unnamed: 0.
The unnamed column can be used as an index instead, by specifying it in index_col
>>> df=pd.read_csv(StringIO(csv+'"'),index_col=0)
>>> df.columns
Index(['source', 'reference', 'Yandex Cloud Translate API v2 (stock)'], dtype='object')

Spacy sentence tokenization very slow and faulty

I wanted to use spacy to do sentence segmentation for the german wikipedia but the problem is it is very slow. The wikipedia after some cleaning is about 55,00 files, each file around 1 Mb. It took around 24 hours to process half of them and write the segmented text to new files, and the sentences are not properly segmented as well
nlp = spacy.load('de_core_news_sm')
for file in files:
file_path = join(rootdir, path, file)
new_file_name = join(output_dir, file + ".txt")
with open(file_path, 'r+', encoding='utf-8') as f:
with open(new_file_name, 'w', encoding='utf-8') as new_file:
content = f.readlines()
doc = ""
for i in range(len(content)):
doc = doc + content[i]
doc = nlp(doc)
sentences = list(doc.sents)
for i in range(len(sentences)):
new_file.write(sentences[i].string.strip() + '\n')
new_file.write('\n')
doc = ""
There are problems with the segmentation itself, for example: this input paragraph:
"Maria I. (England)
Maria I. Tudor (), auch "Maria die Katholische" oder "Maria die Blutige" (* 18. Februar 1516 in Greenwich; † 17. November 1558 im St James’s Palace), war von 1553 bis 1558 Königin von England und Irland und der vierte Monarch des Hauses Tudor. Sie war die Tochter des Königs Heinrichs VIII. und seiner ersten Frau Katharina von Aragon. Als ihr Vater die Ehe vom englischen Klerus für nichtig erklären ließ und Anne Boleyn heiratete, wurde Maria dauerhaft von ihrer Mutter getrennt, zum königlichen Bastard erklärt und von der Thronfolge ausgeschlossen."
has this output:
"Maria I. (England)
Maria I. Tudor
(), auch "Maria die Katholische" oder "Maria
die Blutige
" (*
Februar 1516 in Greenwich;
† 17. November 1558 im St James’s Palace), war von 1553 bis 1558 Königin von England und Irland und der vierte Monarch des Hauses Tudor.
Sie war die Tochter des Königs Heinrichs
VIII. und seiner ersten Frau Katharina von Aragon.
Als ihr Vater die Ehe vom englischen Klerus für nichtig erklären ließ und Anne Boleyn heiratete, wurde Maria dauerhaft von ihrer Mutter getrennt, zum königlichen Bastard erklärt und von der Thronfolge ausgeschlossen."
Please note that in the ouput I write every sentence in a new line

Match everything until certain pattern [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 7 years ago.
Improve this question
So I have this piece of text..
200 g torskefilet
havsalt og friskkværnet peber
8 tynde skiver røget spæk
150 g rødbede (ca. 2 stk.)
½ dl blommeeddike
1 spsk. olivenolie
1 spsk. rørsukker
lidt rødbedeblade eller anden bitter salat
Vask rødbederne, kom dem i en gryde med vand, og bring dem i kog. Kog rødbederne i ca. 30 min., til de er møre, men stadig har lidt bid.
Kom koldt vand på rødbederne, så de køler lidt af, og ”gnid” skindet af efterfølgende, så du kommer ind til rødbedens silkebløde indre.
Skær rødbeder ud i grove tern, og kom dem i en gryde med eddike, sukker og olivenolie.
Lad eddiken koge ind i rødbederne, så de bliver glaserede, og lagen får konsistens som sirup.
Tjek torskefileterne for evt. vildfarne ben og for friskhed (de skal dufte af hav – ikke af havn!).
Skær torsken ud i helt små tern. Brug en skarp kniv, så kødet bliver skåret – ikke moset.
Kom torsketataren i en skål, krydr med salt og peber, og rør rundt.
Form tataren til 4 små bøffer, og sæt dem i køleskabet i 10 min., så tataren lige sætter sig inden den steges.
Varm en pande op, og steg de tynde skiver spæk, så de bliver sprøde og krøller lidt sammen. Tag spækket af panden, og læg det på et stykke køkkenrulle.
Hæld overskydende fedt af panden, og steg så tatarbøfferne i 30 sek. – bare på den ene side. På den måde får de en flot steges korpe, samtidig med at de stadig er rå.
Server bøfferne med de lune, glaserede rødbeder, det sprøde spæk, lidt salat og friskskrabet peberrods-sne (se næste opskrift).
Jeg elsker klassisk kogetorsk med hele svineriet: syltede rødbeder, spæk, høvlet peberrod, fiskesennep og smørsovs – og denne forret er min moderne variant af den evigtgode kombination.
Its a recipe text, the first half is the ingredients with their quantities and the second half is the steps. I'm trying to match using Regex the ingredients and the steps separately.
For ingredients I came up with this Regex string ^(\d|[a-z]).*(?=[A-Z].*)?$ and the for the steps I did this ^[A-Z].*.
However the piece of text is part of a document with recipes each with their own ingredients and steps, so I want to identify each recipe separately. To do that I want to match the ingredients up until the first occurence of the steps pattern and the steps until the first occurence of the ingredients pattern.
How do I do that?
You don't need a regex:
from itertools import imap
from itertools import takewhile, groupby
with open("recipes.txt") as f:
grps = groupby(imap(str.rstrip, f), key=str.islower )
for k, v in grps:
if k:
ing, steps = list(v), list(next(grps, ("", ""))[1])
print(ing)
print(steps)
print("\n\n")
That will work regardless of spacing once the ingredients are always lowercase.
Input:
200 g torskefilet
havsalt og friskkværnet peber
8 tynde skiver røget spæk
150 g rødbede (ca. 2 stk.)
½ dl blommeeddike
1 spsk. olivenolie
1 spsk. rørsukker
lidt rødbedeblade eller anden bitter salat
Vask rødbederne, kom dem i en gryde med vand, og bring dem i kog. Kog rødbederne i ca. 30 min., til de er møre, men stadig har lidt bid.
Kom koldt vand på rødbederne, så de køler lidt af, og ”gnid” skindet af efterfølgende, så du kommer ind til rødbedens silkebløde indre.
Skær rødbeder ud i grove tern, og kom dem i en gryde med eddike, sukker og olivenolie.
Lad eddiken koge ind i rødbederne, så de bliver glaserede, og lagen får konsistens som sirup.
Tjek torskefileterne for evt. vildfarne ben og for friskhed (de skal dufte af hav – ikke af havn!).
Skær torsken ud i helt små tern. Brug en skarp kniv, så kødet bliver skåret – ikke moset.
Kom torsketataren i en skål, krydr med salt og peber, og rør rundt.
Form tataren til 4 små bøffer, og sæt dem i køleskabet i 10 min., så tataren lige sætter sig inden den steges.
Varm en pande op, og steg de tynde skiver spæk, så de bliver sprøde og krøller lidt sammen. Tag spækket af panden, og læg det på et stykke køkkenrulle.
Hæld overskydende fedt af panden, og steg så tatarbøfferne i 30 sek. – bare på den ene side. På den måde får de en flot steges korpe, samtidig med at de stadig er rå.
Server bøfferne med de lune, glaserede rødbeder, det sprøde spæk, lidt salat og friskskrabet peberrods-sne (se næste opskrift).
Jeg elsker klassisk kogetorsk med hele svineriet: syltede rødbeder, spæk, høvlet peberrod, fiskesennep og smørsovs – og denne forret er min moderne variant af den evigtgode kombination.
200 blah
400 bar
foobar bar
Foobar
Bar
Output:
['200 g torskefilet', 'havsalt og friskkv\xc3\xa6rnet peber', '8 tynde skiver r\xc3\xb8get sp\xc3\xa6k', '150 g r\xc3\xb8dbede (ca. 2 stk.)', '\xc2\xbd dl blommeeddike', '1 spsk. olivenolie', '1 spsk. r\xc3\xb8rsukker', 'lidt r\xc3\xb8dbedeblade eller anden bitter salat']
['', 'Vask r\xc3\xb8dbederne, kom dem i en gryde med vand, og bring dem i kog. Kog r\xc3\xb8dbederne i ca. 30 min., til de er m\xc3\xb8re, men stadig har lidt bid.', '', 'Kom koldt vand p\xc3\xa5 r\xc3\xb8dbederne, s\xc3\xa5 de k\xc3\xb8ler lidt af, og \xe2\x80\x9dgnid\xe2\x80\x9d skindet af efterf\xc3\xb8lgende, s\xc3\xa5 du kommer ind til r\xc3\xb8dbedens silkebl\xc3\xb8de indre.', '', 'Sk\xc3\xa6r r\xc3\xb8dbeder ud i grove tern, og kom dem i en gryde med eddike, sukker og olivenolie.', '', 'Lad eddiken koge ind i r\xc3\xb8dbederne, s\xc3\xa5 de bliver glaserede, og lagen f\xc3\xa5r konsistens som sirup.', '', 'Tjek torskefileterne for evt. vildfarne ben og for friskhed (de skal dufte af hav \xe2\x80\x93 ikke af havn!).', '', 'Sk\xc3\xa6r torsken ud i helt sm\xc3\xa5 tern. Brug en skarp kniv, s\xc3\xa5 k\xc3\xb8det bliver sk\xc3\xa5ret \xe2\x80\x93 ikke moset.', '', 'Kom torsketataren i en sk\xc3\xa5l, krydr med salt og peber, og r\xc3\xb8r rundt.', 'Form tataren til 4 sm\xc3\xa5 b\xc3\xb8ffer, og s\xc3\xa6t dem i k\xc3\xb8leskabet i 10 min., s\xc3\xa5 tataren lige s\xc3\xa6tter sig inden den steges.', '', 'Varm en pande op, og steg de tynde skiver sp\xc3\xa6k, s\xc3\xa5 de bliver spr\xc3\xb8de og kr\xc3\xb8ller lidt sammen. Tag sp\xc3\xa6kket af panden, og l\xc3\xa6g det p\xc3\xa5 et stykke k\xc3\xb8kkenrulle.', 'H\xc3\xa6ld overskydende fedt af panden, og steg s\xc3\xa5 tatarb\xc3\xb8fferne i 30 sek. \xe2\x80\x93 bare p\xc3\xa5 den ene side. P\xc3\xa5 den m\xc3\xa5de f\xc3\xa5r de en flot steges korpe, samtidig med at de stadig er r\xc3\xa5.', '', 'Server b\xc3\xb8fferne med de lune, glaserede r\xc3\xb8dbeder, det spr\xc3\xb8de sp\xc3\xa6k, lidt salat og friskskrabet peberrods-sne (se n\xc3\xa6ste opskrift).', '', 'Jeg elsker klassisk kogetorsk med hele svineriet: syltede r\xc3\xb8dbeder, sp\xc3\xa6k, h\xc3\xb8vlet peberrod, fiskesennep og sm\xc3\xb8rsovs \xe2\x80\x93 og denne forret er min moderne variant af den evigtgode kombination.']
['200 blah', '400 bar', 'foobar bar']
['', 'Foobar', 'Bar']
If you want to remove the empty lines:
grps = groupby((line for line in imap(str.rstrip, f) if line), key=str.islower )
Which will remove any empty lines i.e:
['200 blah', '400 bar', 'foobar bar']
['Foobar', 'Bar']
It seems like the first empty line is between the ingredients and the steps, so you might not even need regex:
ingredients, steps = recipe_string.split("\n\n", 1)
This will split the string at the first instance of 2 consecutive newlines.

Categories

Resources