Python:将数组中的字符串与来自另一个数组中的文本的子字符串匹配

时间:2017-12-27 15:26:19

标签: python arrays vectorization string-matching data-extraction

目前,我正在使用Pythons BeautifulSoup Library抓取报纸文章的网页。这些文章存储在对象“详细信息”中。

然后我有几个存储在对象“行”中的各种街道名称。现在我想在文章中搜索“行”中包含的街道名称。

如果其中一个街道名称是其中一篇文章的一部分,我想保护数组中街道的名称。

如果文章不匹配(所选文章不包含任何街道名称),则数组中应该有一个空元素。

例如,让我们假设对象“线”包括(“Abbey Road”,“St-John's Bridge”,“West Lane”,“Sunpoint”,“East End”)。

对象“细节”由4篇文章组成,其中2篇包含“Abbey Road”和“West Lane”(例如“Abbey Road上的车祸,三人受伤”)。其他两篇文章不包含“行”中的任何名称。

然后匹配后结果应该是这样的数组: [] [“Abbey Road”] [] [“West Lane”]

我还被告知要使用Vectorization,因为我的原始数据样本非常大。但是我不熟悉使用矢量化进行String操作。有人曾经使用过吗?

我的代码目前看起来像这样,但是这只返回“-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)                

如果有人想要重现我的实验,则网站上的网址会在上面的代码中,并且对象“详细信息”中的文章的抓取和存储工作正常,因此代码可以被复制。

可以在此Dropbox-Folder中访问对象“lines”的原始数据的.txt文件: https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=0

非常感谢任何提示如何使这项工作,最好是通过Vectorization。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

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