Related
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
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')
I have a sample from a text: The whole text is here: pastebin
Dr. Trischler (FDP): Meine Damen und Herren!
Ich möchte von vornherein als einer der Flücht-
lingsvertreter in diesem Hause meiner Freude
darüber Ausdruck verleihen, daß die Anträge zur
Linderung der Not der Flüchtlinge aus allen Par-
teien kommen, daß sich hier Regierung und Oppo-
sition anscheinend einig in der Auffassung sind,
daß dieses Problem ein allgemeines ist, daß wir
alle gemeinsam zusammenarbeiten müssen. Weil
ich weiß, daß hier das nötige Verständnis vor-
handen ist, will ich mich auch aller Ausführungen
enthalten, die irgendwie allgemeiner Natur sind.
Ich will nicht über die Notwendigkeit der Linde-
rung der Not usw. sprechen, sondern ich will zu
einzelnen Fragen, die in diesen verschiedenen An-
trägen angeschnitten sind, kurz Stellung nehmen.
Die Frage des gerechten Ausgleichs. Auch meine
Fraktion ist hier selbstverständlich für einen ge-
rechten, gleichmäßigen Ausgleich über alle Länder
hinweg. Auch wir lehnen wie die Mehrheit in
diesem Hause es ab, daß man unter den Flücht-
lingen irgendwelche Gruppierungen macht und
daß für die einzelnen Gegenden die oder jene be-
vorzugt behandelt werden sollen
Zur Frage der Freiwilligkeit: Ich habe das Ge-
fühl, daß mein Vorredner von zweierlei Frei-
willigkeit gesprochen hat. Einmal sehe ich die
Frage der Freiwilligkeit vom Standpunkt der Hei-
matvertriebenen aus. In dieser Frage sind wir der
Meinung, daß keinerlei Zwang angewendet werden
darf. Wir kennen aus der Vergangenheit auch ver-
schiedenen „freiwilligen" Zwang; auch dies würden
wir ablehnen. Wir können es den Menschen nicht
zumuten, daß sie noch einmal gezwungen werden,
von dort wieder wegzugehen, wo sie bereits
o einigermaßen eine neue Heimstätte gefunden ha-
ben. — Die zweite Freiwilligkeit ist die Frage der
Freiwilligkeit der Länder, wieweit sie diesen Aus-
gleich für sich wollen oder nicht. Hier können wir
nun vorerst ruhig abwarten, wie weit die eigene
Bereitwilligkeit gehen wird und wieweit es not-
wendig sein müßte, den Artikel 119 des Grund-
gesetzes in Anwendung zu bringen. Jedenfalls
nehmen wir zu diesem Ausgleich den Standpunkt
ein, daß es notwendig ist, daß der Ausgleich
erfolgt und ausreichend durchgeführt wird.
Das, was wir jetzt hören, es sei geplant, bis Ende
1950 300 000 umzusiedeln, ist bestimmt keine Lö-
sung. Denn wir haben von den Vorrednern zu die-
sem Thema bereits gehört, daß soundso viele Flücht-
linge wieder neu zuströmen, so daß es Ende 1950
wahrscheinlich so aussehen wird, daß sich praktisch
gar nichts geändert hat, weil dieselben Länder, die
Flüchtlinge abgeben, sehr bald wieder mindestens
ebenso viele aufgenommen haben werden.
Präsident Dr. Köhler: Bevor wir fortfahren, darf
ich zunächst diesen Antrag zur Geschäftsordnung
zur Aussprache stellen. Wird das Wort zur Un-
terstützung des Antrags auf vorläufige Aussetzung
der ersten Beratung der Drucksache Nr. 17 ge-
wünscht? — Bitte, Herr Abgeordneter Kiesinger.
I want to split the text in to sections for every Speaker. Thats mean, if I found a Speaker, the section until the next speaker is the text from the previous Speaker.
A Speaker is e.g.: Dr. Trischler (FDP): or the Präsident Dr. Köhler:
And I want to split the text, before the matched Speaker. So I can separate the text to each speaker.
My Code:
def regex_tokenizer(text):
regex = r"(\s+(?=(Vizepräsident|Präsident)([\s])([A-Z])([A-z])........:))|(\s+(?=([A-Z]+[a-z]*)([\s]*)(\([A-Z]*\))))"
splitedtext = re.split(regex, text)
return splitedtext
def search(splitedtext):
searched = [s for s in splitedtext if "Bonn" in s]
print(search())
For a search in the splitted list I get the error:
Traceback (most recent call last):
File "/Usersx/check_pdfs.py", line 59, in <module>
search(splitedtext=regex_tokenizer(text=read_file()))
File "/Usersx/check_pdfs.py", line 46, in search
searched = [s for s in splitedtext if "Bonn" in s]
File "x/check_pdfs.py", line 46, in <listcomp>
searched = [s for s in splitedtext if "Bonn" in s]
TypeError: argument of type 'NoneType' is not iterable
I cannot find the problem. Is the problem on my regex? or on the regex method? or on the search list comprehension?
You have an over complicated regex. Try this instead:
regex = r"(^.*:)"
this will result in the following:
['', 'Dr. Trischler (FDP):', ' Meine Damen und Herren! ...', ...]
Please check if this Regex works for you:
((?:Dr\.|Vizepräsident|Präsident).*(?<!cid)):((?:(?!Dr\.|Vizepräsident|Präsident).*\n)*)
Demo
I would like to scrape all comments from all pages of a specific article. For example this article: Link
I think the comments are in javascript, could anyone help me figure out how I can scrape all comments?
This is the code I use
def getSpiegelComments(url):
try:
html = urlopen(url)
except HTTPError as e:
print(e)
return None
try:
bsObj = BeautifulSoup(html, 'html.parser')
comments = bsObj.findAll("div", {"class": "article-comment"})
except AttributeError as e:
return None
for comment in comments:
yield comment
url = 'http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html'
comments = getSpiegelComments(url)
if comments == None:
print("Comments could not be found on " + url)
else:
for comment in comments:
print(comment)
I need all comments (currently 124) from all pages. Not only the 5 comments from the first page.
All the text is available after each div.article-comment-title under the divs with the class js-article-post-full-text:
import requests
soup = BeautifulSoup(requests.get("http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html").content)
for comm in soup.select("div.article-comment-title"):
print(comm.a.text)
print(comm.find_next("div","js-article-post-full-text").text)
To get all 120+, you can use the url http://www.spiegel.de/fragments/community/spon-495132-{}.html passing in the offset number to start from:
import re
def yield_comments(soup):
for comm in soup.select("div.article-comment-title"):
yield comm.a.text.strip(),comm.find_next("div", "js-article-post-full-text").text.strip()
next_url = "http://www.spiegel.de/fragments/community/spon-495132-{}.html"
url = "http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html"
with requests.Session() as s:
soup = BeautifulSoup(s.get(url).content)
# get total comments
tot = re.search("\d+",soup.select_one("#js-article-comments-box-pager").find_previous_sibling("span").text)
tot = int(tot.group())
# get comments from first page
for title, com in yield_comments(soup):
print(title, com)
# start at the 6th comment until the end
for page in range(6, tot, 5):
soup = BeautifulSoup(s.get(next_url.format(page)).content)
for title, com in yield_comments(soup):
print(title, com)
That will give you comments all the way to 124:
.......................................
(u'117. Horst John', u'Zitat von Horst JohnAl-Sham, Al-Nusra usw. sind Nachfolger der Al qaida. Diese als Befreier zu sehen ist der blanke Hohn. Schauen sie nur die youtube Videos diese langb\xe4rtigen gekauften Terrorbande sich an. Waffendepots in Krankenh\xe4user und Schulen, Bombenattacken auf Fl\xfcchtlingscamps sind das Werk dieser Terroristen.\r\n\r\nWer sieht die denn hier oder auf SPON als Befreier? das steht ja nur, das das die letzte Hoffnung ist. Und so wird es sich wahrscheinlich auch f\xfcr die dort hungernden Menschen anf\xfchlen.')
(u'118. Verantwortung', u"Die viel naheliegendere Frage ist, warum ein Umsturzversuch, egal aus welcher Motivation heraus, der hunderttausende Tote gefordert, Millionen Menschen vertrieben und ein ganzes Land in eine Tr\xfcmmerlandschaft verwandelt hat, nicht l\xe4ngst vor Jahren abgebrochen wurde. \r\nDie Antwort ist bekannt und hat mit einer weiteren Frage zu tun:\r\n\r\nWieso fand sich die Bundesrepublik in einer Gemeinschaft der 'Freunde Syriens' mit Saudi-Arabien, Katar und der T\xfcrkei wieder, die nun beim besten Willen mit Demokratie in Syrien nichts zu tun hatten, die aber sp\xe4testens seit anfang 2012 flei\xdfig Waffen nach Syrien pumpten?\r\nhttp://www.nytimes.com/interactive/2013/03/25/world/middleeast/an-arms-pipeline-to-the-syrian-rebels.html?ref=middleeast&_r=0")
(u'119. # Piece', u'Zitat von Pieceich war bisher nicht als Kommentator bei SPON registriert, aber der hier publizierte Artikel ist derart nah an der Grenze zur islamistischen Propaganda, dass ich mich einer scharfen Protestnote nicht erwehren kann:\r\nWie um alles in der Welt ist es m\xf6glich radikalste Islamisten als "letzte Hoffnung f\xfcr Aleppo" derart offen zu glorifizieren? \r\n\r\nUnter gr\xf6\xdftem Wohlwollen verbleiben als Motivation f\xfcr diese Zeilen zwei M\xf6glichkeiten:\r\n\r\n1.Dem Autor dieses Artikels ist nicht bekannt welche Konsequenzen ein Sieg dieser "Freiheitsk\xe4mpfer" f\xfcr die Zivilbev\xf6lkerung nach sich z\xf6ge. \r\n\r\n2. Die Konsequenzen sind bekannt, werden jedoch als weniger schwerwiegend erachtet.\r\n\r\nBeides disqualifiziert den Autor im SPON zu publizieren.\r\n\r\n\r\nWas die wahren Motive der Dschihadisten (Stichwort: menschliche Schutzschilde usw.) anbetrifft, ganz zu schweigen.\r\n\r\nEs gibt noch eine Dritte M\xf6glichkeit: Sie haben den Autor nicht verstanden. Er hat sich keineswegs mit den Terroristen gemein gemacht, sondern lediglich versucht, die Gef\xfchlslage der dort eingeschlossenen Menschen nachzuvollziehen. Aber da m\xfcsste man dann nat\xfcrlich mal genauer lesen und auch noch mitdenken.')
(u'120. Die letzte Hofnung', u'Islamisten die letzte, im wahrsten Sinne des Wortes,\r\nHoffnung. Sind nicht die Islamisten und andere Rebellen der Grund daf\xfcr, dass die Bev\xf6lkerung so tief in der ...\r\nsitzt. Von wem wird dieser Schreiber eigentlich gesponsert.')
(u'121. #jethan', u'Zitat von jethaneigentlich islamische Terroristen, sind der Grund und der Ausl\xf6ser dieser Katastrophe.\r\nSie jetzt als Retter zu pr\xe4sentieren ist blanker Hohn gegen\xfcber der betroffenen Bev\xf6lkerung.\r\nDie h\xe4tte l\xe4ngst durch die Korridore die Stadt verlassen k\xf6nnen, w\xe4re sie nicht von den Terroristen, ja genau, denselben die sich jetzt als Retter feiern lassen, daran gehindert worden.\r\n\r\nDer Ausl\xf6ser ist Assat selbst: Er hat friedliche Demonstrationen mit Panzern niederwalzen lassen. DAS war der Beginn. Weitere Proteste der Bev\xf6lkerung gegen dieses Vorgehen folgte auf dem Fu\xdfe. Daraufhin lie\xdf Assat massiv seine Armee gegen die Demonstranten einsetzen.\r\n\r\nDas schaukelte sich dann soweit hoch, das teils ein machtvakuum entstand. Erst jetzt traten fanatische Islamisten auf den Plan.\r\n\r\nSie ignorieren die ganze Vorgeschichte.')
(u'122.', u'Zitat von jowittIch weis nicht, was Sie haben. In dem Artikel steht nichts davon, das die angreifenden Islamisten "gut" seien. Im gegenteil: Dort wird beschrieben, das sie einen "Gottesstaat" nach der Scharia wollen.\r\n\r\nNehmen Sie eigentlich alles so w\xf6rtlich? Dank zahlreicher Stilmittel l\xe4sst sich ein Text nicht nur interessant gestalten, manche lassen sich auch hervorragend dazu verwenden einen unterbewussten Eindruck beim Leser haften zu lassen. Propaganda egal welcher politischen Seite funktioniert auch oft auf die gleiche Art.\r\n\r\nDie "Rebellen" (stimme f\xfcr Unwort des Jahres in dieser Verwendung) l\xe4sst der Autor im Artikel an vielen Stellen tats\xe4chlich so dastehen als w\xfcrden diese nur den Zivilisten helfen wollen. Das wird so explizit nicht klar genannt, erschlie\xdft sich jedoch aus Wortwahl, Inhalt und Zusammenhang. W\xfcrde man in der Presse das offen so schreiben, w\xfcrde man hinterher definitiv darauf festgenagelt werden. Suchen Sie den Link des Mitkommentators zur ZON Meldung raus, nachdem die Rebellen die Zivilisten nicht aus der Stadt lassen. Dann vergleichen Sie den Inhalt dieses Artikels mit den vorliegenden Fakten, gerne auch auf den BBC News Seiten, die in dem Fall auch wesentlich objektiver sind. Das macht es u. U. leichter nachzuvollziehen, was der Vorposter gemeint hat.\r\n\r\nDie Rebellen, komischerweise tats\xe4chlich nicht Terroristen genannt obwohl die Definition passt, werden von Anfang an auf SPON und einigen anderen Nachrichtenseiten sehr besch\xf6nigend in den Artikeln abgebildet, \xe4hnlich der neuen Kiewer Regierung oder in weiten Teilen auch Erdogan. Da muss man noch nicht einmal auf RT oder \xe4hnliche Seiten, um das als Bl\xf6dsinn auszufiltern, da reichen ganz normale, objektive Nachrichten ohne Meinungsbildung alla BILD.')
(u'123. Guter Bericht', u'Danke f\xfcr diesen Bericht zur Lage in Syrien. \r\n\r\nUnd auch etwas zum Nachdenken: Wenn wir (die freien Demokratien) nicht helfen, aber radikale Islamisten, wird da nicht die H\xe4lfte Bev\xf6lkerung Syriens - immerhin mehr als 10 Millionen Menschen - den Islamisten geradezu in die Arme getrieben? Unterlassene Hilfeleistung wird bestraft. aj')
(u'124. Unterst\xfctzung von Extremisten', u'Zitat von jowittIch weis nicht, was Sie haben. In dem Artikel steht nichts davon, das die angreifenden Islamisten "gut" seien. Im gegenteil: Dort wird beschrieben, das sie einen "Gottesstaat" nach der Scharia wollen.\r\n\r\nWas steht in der \xdcberschrift?\r\n"Belagerte Stadt in Syrien: Die Islamisten sind Aleppos letzte Hoffnung"\r\nund weiter geht\'s:\r\n"W\xe4hrend die USA und Europa zusehen, wie Hunderttausende Menschen in Aleppo ausgehungert werden, kommen Islamisten den Eingeschlossenen zur Hilfe. Angef\xfchrt werden sie von einer Terrormiliz."\r\n\r\nWie w\xfcrden Sie denn diese SPON Einf\xfchrung interpretieren?\r\nEs steht doch w\xf6rtlich da - eine Terrormiliz kommt den Eingeschlossenen zu Hilfe und ist Hoffnung, sogar letzte Hoffnung.\r\n\'Hilfe\' assoziiere ich immer noch mit \'etwas Gutes leisten\'.\r\nEs steht im Text dann auch an keiner Stelle, da\xdf diese Hilfe vom Autor irgendwie ablehnt wird. \r\nWie auch an keiner Stelle belegt ist, da\xdf die Bev\xf6lkerung diese Hilfe \xfcberhaupt haben will, das aber nur nebenbei.\r\n\r\nEntweder der SPON Autor hat sich hier semantisch vertan, oder er hat sich als Unterst\xfctzer von Extremisten geouted.')
You should be scraping from this link instead of the one you provided because its where the actual comments are coming from and this way it allows you to escape the javascript on the URL you posted that's hiding the comments you want.
If you scrape from this link, getting ALL the comments should be simple because, conveniently, each of the pages here have the same "base" URL (http://www.spiegel.de/forum/politik/belagerte-stadt-syrien-die-islamisten-sind-aleppos-letzte-hoffnung-thread-495132-) and then the page number is added on at the end as 1.html, 2.html and so on.
This means in your code you will want to loop through each of these pages. Here is some pseudo code to help you get started.
def comment_spider(max_pages):
page = 1 #start on page 1
comments_list = []
while page <= max_pages:
url = 'http://www.spiegel.de/forum/politik/belagerte-stadt-syrien-die-islamisten-sind-aleppos-letzte-hoffnung-thread-495132-'+str(page)+'.html'
req = requests.get(url)
plain_text = req.text
soup = BeautifulSoup(plain_text, "lxml")
for items in soup.findAll('div', {'class': 'comment'}): #you need to get the actual information for this yourself
comment = items.get_text()
comments_list.append(comment)
page += 1
return comments_list
Then to call this function you would give it the total number of pages. E.g.
comment_spider(13)
I have a german unicode String like
text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'
that also contains Ü Ö Ä, and other german special chars. My aim is to get one string that only contains the words that start with a capital letter, as follows:
result = 'Und Wenn Psychoanalytiker Buch Inhalt Str\xf6mung Leute ...'
I have tried
pattern = r'(\b[^A-Z]+\b)'
re.sub(pattern, '', text)
but am totally new to regexes
With re.sub(...) you replace every match with the string specified by the second parameter. I think what you want is:
pattern = ur'([A-ZÄÖÜ][^., \t\n]*)'
result = " ".join(re.findall(pattern, text))
Update
Here is an other solution. This one is a little bit more precise than my first one (especially for the german language).
import re
text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'
pattern = ur'[A-ZÄÖÜ][a-zäöüß-]*'
result = " ".join(re.findall(pattern, text))
Explanation:
[A-ZÄÖÜ] match a single character in the range between A and Z or the characters Ä, Ö or Ü. This character is followed by:
[a-zäöüß]+ match one ore more characters in the range between a and z or the characters ä, ö, ü or ß.
re.findall(...) matches all occurrences of a pattern and returns a list of matches.
" ".join(...) returns a whitespace-separated string which is the concatenation of the words in the list.
The chacacter class [^A-Z] will exclude all upper case letters from A to Z, but not an uppercase umlaut - or other uppercase unicode characters not in that range.
You can use re.findall to split your string into single words and then check wheather they start with an upper case letter:
>>> import re
>>> text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'
>>> [w for w in re.findall(r"\b\w+\b", text, re.U) if w[0].isupper()]
[u'Und', u'Wenn', u'Psychoanalytiker', u'Buch', u'Inhalt', u'Str\xf6mung', u'Leute', u'Nase', u'Papa', u'Mama', u'\xd6dipus', u'Kastration', u'Regression', u'Sexualit\xe4t', u'Bild', u'Die', u'Psychoanalytiker', u'Massen', u'Massen']