代码之家  ›  专栏  ›  技术社区  ›  DataFreshman

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

  •  2
  • DataFreshman  · 技术社区  · 7 年前

    目前,我正在使用Pythons BeautifulSoup图书馆为报纸文章爬行网页。这些物品存储在对象“details”中。

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

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

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

    例如,假设对象“线”由(“Abbey Road”、“St John’s Bridge”、“West Lane”、“Sunpoint”、“East End”)组成。

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

    然后,匹配后的结果应为如下数组: [][“Abbey Road”][[“West Lane”]

    我还被告知要使用矢量化,因为我的原始数据样本相当大。但是,我不熟悉如何将矢量化用于字符串操作。有人用过这个吗?

    我的代码当前如下所示,但这只返回“-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就在上面的代码中,并且在对象“details”中爬行和存储文章的工作正常,因此可以复制代码。

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

    非常感谢您给我的任何提示,我可以如何做到这一点,最好是通过矢量化。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gunnar Sigfusson    7 年前

    您可以尝试以下方式:

    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