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

标签 python arrays vectorization string-matching data-extraction

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

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

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

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

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

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

那么匹配后的结果应该是这样一个数组: [][“艾比路”][][“西巷”]

我还被告知为此使用矢量化,因为我的原始数据样本非常大。但是我不熟悉对 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)                

如果有人想重现我的实验,Website-Url在上面的代码中,并且在对象“details”中抓取和存储文章是正常的,所以代码可以复制。

可以在这个 Dropbox 文件夹中访问对象“行”的原始数据的 .txt 文件: https://www.dropbox.com/s/o0cjk1o2ej8nogq/a4.txt?dl=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

关于Python:将一个数组中的字符串与另一个数组中的文本中的子字符串进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47994661/

相关文章:

python - pymongo 的 vim 自动完成

ios - 仅在 TableView 的特定单元格上显示和隐藏 View

javascript - 转置 JavaScript 数组和对象

c# - 在 C# 中重用数组

python - 如何在 numpy 中推广元素矩阵运算

python - 根据行的内容对所有行进行排序

python - 根据同一df中其他列的多个列值过滤df

python - 递归函数在具有错误处理的Python中要求用户输入

python - 用随机数替换条件下的numpy数组值

python - 将列的值与大小递减的数组(或系列)进行比较