2017-12-27 174 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等单个字符。 –