1

현재 Pythons BeautifulSoup Library를 사용하여 신문 기사의 웹 페이지를 크롤링하고 있습니다. 이러한 기사는 개체 "세부 정보"에 저장됩니다.파이썬 : 배열의 문자열과 다른 배열의 텍스트 부분 문자열

그런 다음 개체 "줄"에 저장되는 여러 거리의 이름이 두 개 있습니다. 이제 "선"에 포함 된 거리 이름에 대한 기사를 검색하려고합니다.

거리 이름 중 하나가 기사의 일부인 경우 배열의 거리 이름을 안전하게 지키고 싶습니다.

기사와 일치하는 항목이없는 경우 (선택한 기사에 거리 이름이 포함되어 있지 않은 경우) 배열에 빈 요소가 있어야합니다.

예를 들어, "선로"가 "Abbey Road", "St-John 's Bridge", "West Lane", "Sunpoint", "East End"로 구성된다고 가정 해 봅시다.

개체 "세부 정보"는 "Abbey Road"와 "West Lane"이 포함 된 4 개의 기사로 구성됩니다 (예 : "Abbey Road의 교통 사고, 3 명이 다쳤습니다"). 다른 2 개의 기사에는 "줄"의 이름이 없습니다.

다음이 같은 배열이 결과와 일치 한 후 :

는 [] [ "애비로드"] [] [ "서쪽 레인은"] 나는 또한 내 원래,이에 대한 자동 벡터를 사용하는 들었다 데이터 샘플이 상당히 큽니다. 그러나 문자열 연산에 벡터화를 사용하는 것에 익숙하지 않습니다. 아무도 이미 이걸 가지고 일 했니?

내 코드는 현재 다음과 같습니다 그러나이 경우에만 반환 "-1"내 결과 배열의 요소로 : 누군가가 내 실험을 재현하고자하는 경우

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)     

, 웹 사이트 - URL이 위의 코드에 개체 "세부 정보"의 기사 크롤링 및 저장이 제대로 작동하므로 코드를 복사 할 수 있습니다.

"라인"개체에 대한 내 원래의 데이터에 대한 .txt 인 파일이 보관-폴더에 액세스 할 수 있습니다 https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=0

덕분에 어떤 힌트를 많이 나는 벡터화를 통해 바람직하게는,이 일을 할 수있는 방법 .

+0

내가 변수'soup' 각 반복에 덮어 쓰기됩니다 루프에 대한 두 번째에 대해 매우 확신입니다. 어쨌든 전체 코드를 실행하고 문제를 이해하려고 노력합니다. –

+0

두 번째 for 루프는 뉴스 보고서가 저장된 웹 사이트의 여러 페이지를 크롤링하기위한 것입니다. 첫 번째 for 루프와 페이지 매김의 카운터가 URL에서 27입니다. 각 링크는 한 페이지에 대한 링크 목록을 만듭니다. 그러나 거리 이름을 "a4.txt"의 목록과 일치시키고 거리 이름과 일치하지 않는 요소가 비어 있고 일치하는 이름을 가진 요소가 일치하는 요소가있는 배열에 저장하면 기사에서 거리 이름을 추출하는 데 어려움을 겪고 있습니다. 이름 만. 내 전체 코드가 위의 게시물에 있으며 "a4.txt"에 대한 링크가 있습니다. @VivekHarikrishnan – DataFreshman

답변

0

당신은 이런 식으로 뭔가를 시도 할 수 :

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

웹 사이트에서 크롤링 한 기사 및 거리 이름이 포함 된 .txt 파일과 어떤 이유로 인해 작동하지 않습니다. 그러나 일반적으로이 예제를 해결합니다. 어쩌면 내가 몇 가지 중얼 거리면서 내 구체적인 설정에 맞게 작동하도록 만들 수 있습니다. 어쨌든, 귀하의 제안에 많은 감사드립니다[email protected] Sigfusson – DataFreshman

+0

그래, 주말에 이걸 좀 더 자세히 살펴 보겠다. 위의 코드는 수프와도 잘 어울리지 만, 인코딩 관련 문제 (habe Erfahrung mit deutschen Buchstaben :)을 볼 수있다. 예외. 나는 또한 성능에 관해 예상되는 빈 결과를 다루기 위해 잡으려고 시도하는 것보다 나은 것을 발견하려고 노력할 것입니다. –

+0

@DataFreshman 늦게 검토해 주셔서, (수정 된) 데이터로 어떻게 든 작동하는 코드로 원래 응답을 업데이트했습니다. 내가 주된 문제는 데이터의 인코딩/디코딩이 잘못되었음을 제안했기 때문에, 먼저 웹 페이지 데이터와 a4.txt 파일에 많은 허점이있다. a4.txt 파일을 UTF8로 올바르게 인코딩하거나 왜곡 된 올바른 독일어 문자를 작성해야합니다 (독일어 로컬 설정에서 작동 함). 나는 후자를 했어. 나는 또한 C, D, E, F, G, X 등과 같은 많은 단일 문자를 제거했다. –