1

Derzeit crawle ich eine Webseite für Zeitungsartikel mit Pythons BeautifulSoup Library. Diese Artikel sind im Objekt "Details" gespeichert.Python: Passende Strings aus einem Array mit Substrings aus Texten in einem anderen Array

Dann habe ich ein paar Namen von verschiedenen Straßen, die im Objekt "Linien" gespeichert sind. Jetzt möchte ich die Artikel nach den Straßennamen durchsuchen, die in "Zeilen" enthalten sind.

Wenn einer der Straßennamen Teil eines der Artikel ist, möchte ich den Namen der Straße in einem Array sichern.

Wenn für einen Artikel keine Übereinstimmung gefunden wird (der ausgewählte Artikel enthält keine der Straßennamen), sollte ein leeres Element im Array vorhanden sein.

Nehmen wir zum Beispiel an, das Objekt "Linien" würde aus ("Abbey Road", "St. John's Bridge", "West Lane", "Sunpoint", "East End") bestehen.

Das Objekt "Details" besteht aus 4 Artikeln, von denen 2 "Abbey Road" und "West Lane" enthalten (z. B. in "Autounfall auf Abbey Road, drei Menschen verletzt"). Die anderen 2 Artikel enthalten keine Namen von "Zeilen".

Dann, nachdem das Ergebnis passende sollte ein Array wie folgt sein: [] [ „Abbey Road“] [] [ „West Lane“]

ich auch Vektorisierung für diesen Einsatz wurde gesagt, als meine ursprüngliche Datenmuster ist ziemlich groß. Ich bin jedoch nicht vertraut mit der Verwendung der Vektorisierung für String-Operationen. Hat schon jemand damit gearbeitet?

Mein Code sieht derzeit wie folgt aus, aber dies nur gibt „-1“ als Elemente meiner resultierende Array:

from bs4 import BeautifulSoup 
import requests 
import io 
import re 
import string 
import numpy as np 


my_list = [] 
for y in range (0, 2): 
    y *= 27 
    i = str(y) 
    my_list.append('http://www.presseportal.de/blaulicht/suche.htx?q=' + 'einbruch' + '&start=' + i) 



for link in my_list: 
    # print (link) 
    r = requests.get(link) 
    r.encoding = 'utf-8' 
    soup = BeautifulSoup(r.content, 'html.parser') 



with open('a4.txt', encoding='utf8') as f: 
     lines = f.readlines() 
     lines = [w.replace('\n', '') for w in lines]  


     details = soup.find_all(class_='news-bodycopy') 
     for class_element in details: 
      details = class_element.get_text() 

     sdetails = ''.join(details) 
     slines = ''.join(lines) 
     i = str.find(sdetails, slines[1 : 38506]) 
     print(i)     

Wenn jemand mein Experiment reproduzieren will, ist die Website-URL im Code oben und das Crawlen und Speichern von Artikeln im Objekt "Details" funktioniert einwandfrei, so dass der Code einfach kopiert werden kann. für Hinweise https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=0

Vielen Dank, wie ich diese Arbeit machen kann, vorzugsweise über Vektorisierung:

Die .txt-Datei für meine ursprünglichen Daten für das Objekt „Linien“ kann in diesem Dropbox-Ordner zugegriffen werden .

+0

Ich bin ziemlich unsicher über die zweite for-Schleife, wo Variable 'soup' auf jeder Iterationen überschrieben. Wie auch immer, lassen Sie mich versuchen, Ihren gesamten Code auszuführen und das Problem zu verstehen! –

+0

Die zweite for-Schleife dient zum Crawlen der verschiedenen Seiten der Website, auf denen die Nachrichten gespeichert sind. Wir erstellen eine Liste von Links, jeder Link für eine Seite, mit der ersten for-Schleife und der Zähler der Paginierung ist 27 in der URL. Allerdings habe ich Schwierigkeiten, die Straßennamen aus den Artikeln zu extrahieren, indem ich sie mit der Liste aus "a4.txt" abgleiche und sie in einem Array ablege, wo Elemente ohne übereinstimmende Straßennamen leer sind und Elemente mit übereinstimmenden Namen das passende enthalten nur Name. Mein gesamter Code ist in dem Beitrag oben und es gibt einen Link für die "a4.txt". @VivekHarikrishnan – DataFreshman

Antwort

0

Man könnte so etwas wie dies versuchen:

my_list = [] 
for y in range (0, 2): 
    i = str(y) 
    my_list.append('http://www.presseportal.de/blaulicht/suche.htx?q=einbruch&start=' + i) 

for link in my_list: 
    r = requests.get(link) 
    soup = BeautifulSoup(r.content.decode('utf-8','ignore'), 'html.parser') 

details = soup.find_all(class_='news-bodycopy') 
f = open('a4.txt') 
lines = [line.rstrip('\r\n') for line in f] 

result = [] 
for i in range(len(details)): 
    found_in_line = 0 
    for j in range(len(lines)): 
     try: 
      if details[i].get_text().index(lines[j].decode('utf-8','ignore')) is not None: 
       result.append(lines[j]) 
       found_in_line = found_in_line + 1 
     except: 
      if (j == len(lines)-1) and (found_in_line == 0): 
       result.append(" ") 
print result 
+0

Aus irgendeinem Grund funktioniert es nicht mit den Artikeln, die von der Website und der TXT-Datei, die die Straßennamen enthält, gecrawlt werden. Aber im Allgemeinen löst dies das Beispiel. Vielleicht kann ich es für meine spezifische Einstellung mit etwas Fiddeling arbeiten lassen. In jedem Fall, vielen Dank für Ihren [email protected] Sigfusson – DataFreshman

+0

Ok danke, ich schaue mir das am Wochenende genauer an, der obige Code sollte auch mit den Suppensachen funktionieren, aber ich sehe einige Probleme mit der Codierung (habe Erfahrung mit deutschen Buchstaben :)), die ein Extra hinzufügen könnten Ausnahme. Ich werde auch versuchen, etwas Besseres zu finden, als zu versuchen, die erwarteten leeren Ergebnisse in Bezug auf die Leistung anzugehen. –

+0

@DataFreshman Sorry für späte Überprüfung, ich habe die ursprüngliche Antwort mit Code aktualisiert, der irgendwie mit Ihren (geänderten) Daten funktioniert. Als ich das Hauptproblem vorschlug, war die falsche Kodierung/Entschlüsselung Ihrer Daten, zuerst die Webpage-Daten und dann gibt es eine Menge Mist in der a4.txt - Datei. Sie müssen die a4.txt-Datei aktualisieren, damit sie entweder UTF8-codiert ist oder Sie schreiben einfach die korrekten deutschen Buchstaben, wo sie verzerrt sind (das wird mit Ihren deutschen lokalen Einstellungen funktionieren). Letzteres habe ich gemacht, ich habe auch viele einzelne Zeichen wie C, D, E, F, G, x usw. entfernt. –

Verwandte Themen