【发布时间】: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