2017-12-27 251 views
1

目前,我正在使用Pythons BeautifulSoup Library來檢索報紙文章的網頁。這些文章存儲在對象「細節」中。Python:從陣列中匹配字符串與另一個陣列中文本的子字符串

然後我有幾個存儲在對象「行」中的各種街道名稱。現在我想搜索「行」中包含的街道名稱的文章。

如果其中一個街道名稱是其中一篇文章的一部分,我想在數組中保護街道名稱。

如果沒有匹配項目(所選文章不包含任何街道名稱),那麼數組中應該有一個空元素。例如,假設對象「線」由(「Abbey Road」,「St-John's Bridge」,「West Lane」,「Sunpoint」,「East End」)組成。

對象「細節」由4篇文章組成,其中2篇包含「Abbey Road」和「West Lane」(例如「Abbey Road車禍,三人受傷」)。其他兩篇文章不包含任何來自「行」的名稱。

那麼結果匹配應該是這樣的一個陣列中後: [] [「艾比路」] [] [「西一巷」]

我也被告知要使用矢量對於這一點,因爲我原來的數據樣本相當大。不過,我對字符串操作使用矢量化並不熟悉。有沒有人與此合作?

我的代碼目前看起來是這樣的,但是這僅返回「-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)     

如果有人想複製我的實驗,網站,鏈接在上面的代碼並且對象「細節」中的文章的抓取和存儲工作正常,因此代碼可以被複制。

中的.txt文件對我原來的數據爲對象的「線」可以在這個Dropbox的,文件夾進行訪問: https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=0

非常感謝任何提示我怎樣才能使這項工作,最好是通過矢量。

+0

我相當不確定的第二個for循環,其中變量'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文件。 但通常這解決了這個例子。也許我可以讓它在我的特定環境下工作,並且有些煩躁。無論如何,非常感謝您的建議。@Gunnar Sigfusson – DataFreshman

+0

好的,謝謝,我會在週末仔細研究這個,上面的代碼也應該與湯的東西,但我看到一些編碼相關的問題(哈夫Erfahrung mit deutschen Buchstaben :)),可以添加額外例外。我也會嘗試找到一些比嘗試抓住更好的方法來解決性能預期的空洞結果。 –

+0

@DataFreshman對不起,遲來的審查,我沒有更新原來的答案,代碼與你的(修改)數據以某種方式工作。正如我所建議的主要問題是數據的錯誤編碼/解碼,首先是網頁數據,然後在a4.txt文件中存在很多垃圾。您需要將a4.txt文件更新爲正確的UTF8編碼,或者只是在扭曲的地方寫入正確的德文字母(這將與您的德語本地設置一起使用)。我做了後一個,我也刪除了很多像C,D,E,F,G,x等單個字符。 –