【问题标题】:Python: Matching Strings from an Array with Substrings from Texts in another ArrayPython:将数组中的字符串与另一个数组中文本的子字符串匹配
【发布时间】:2017-12-27 15:26:18
【问题描述】:

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

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

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

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

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

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

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

我还被告知要为此使用矢量化,因为我的原始数据样本非常大。但是我不熟悉使用向量化进行字符串操作。有人用过这个吗?

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

非常感谢任何提示我如何使它工作,最好是通过矢量化。

【问题讨论】:

  • 我不太确定第二个 for 循环,其中变量 soup 将在每次迭代中被覆盖。无论如何,让我尝试运行您的整个代码并理解问题!
  • 第二个for循环用于抓取存储新闻报道的网站的不同页面。我们创建一个链接列表,每个链接对应一个页面,第一个 for 循环和分页计数器在 URL 中是 27。但是,我很难从文章中提取街道名称,方法是将它们与“a4.txt”中的列表进行匹配并将它们存储在一个数组中,其中没有匹配街道名称的元素是空的,并且具有匹配名称的元素包含匹配的名称只要。我的整个代码都在上面的帖子中,并且有一个“a4.txt”的链接。 @VivekHarikrishnan

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


【解决方案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

【讨论】:

  • 由于某种原因,它不适用于从网站抓取的文章和包含街道名称的 .txt 文件。但总的来说,这解决了这个例子。也许我可以通过一些小技巧使它适用于我的特定设置。无论如何,非常感谢您的建议。 @Gunnar Sigfusson
  • 好的,谢谢,我会在周末仔细研究一下,上面的代码也应该适用于汤的东西,但我看到一些与编码相关的问题(habe Erfahrung mit deutschen Buchstaben :))可以添加一个额外的例外。我还将尝试找到比 try catch 更好的方法来解决与性能有关的预期空洞结果。
  • @DataFreshman 抱歉迟到了审查,我确实使用与您的(修改后的)数据一起工作的代码更新了原始答案。正如我所建议的那样,主要问题是您的数据编码/解码不正确,首先是网页数据,然后 a4.txt 文件中有很多废话。您需要将 a4.txt 文件更新为正确的 UTF8 编码,或者只在它们被扭曲的地方写入正确的德语字母(这将适用于您的德语本地设置)。我做了后一个,我还删除了很多单个字符,如 C、D、E、F、G、x 等。
  • 哇,感谢所有的努力!做得好。 @Gunnar Sigfusson
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多