4

我有一个公司名称列表,并且我有一个 url 提及公司名称的列表。

最终目标是查看 url,并找出 url 上的公司中有多少在我的列表中。

示例 URL:http ://www.dmx.com/about/our-clients

每个 URL 的结构都不同,所以我没有一个很好的方法来进行正则表达式搜索并为每个公司名称创建单独的字符串。

我想构建一个 for 循环来从 URL 的全部内容列表中搜索每个公司。但似乎 Levenshtein 更适合两个较小的字符串,而不是一个短字符串和一大段文本。

这个初学者应该在哪里寻找?

4

2 回答 2

5

在我看来,您不需要任何“模糊”匹配。我假设当你说“url”时,你的意思是“url指向的地址的网页”。只需使用 Python 的内置子字符串搜索功能:

>>> import urllib2
>>> webpage = urllib2.urlopen('http://www.dmx.com/about/our-clients')
>>> webpage_text = webpage.read()
>>> webpage.close()
>>> for name in ['Caribou Coffee', 'Express', 'Sears']:
...     if name in webpage_text:
...         print name, "found!"
... 
Caribou Coffee found!
Express found!
>>> 

如果您担心字符串大小写不匹配,只需将其全部转换为大写即可。

>>> webpage_text = webpage_text.upper()
>>> for name in ['CARIBOU COFFEE', 'EXPRESS', 'SEARS']:
...     if name in webpage_text:
...         print name, 'found!'
... 
CARIBOU COFFEE found!
EXPRESS found!
于 2011-05-25T01:01:10.387 回答
3

我会在 senderle 的回答中补充一点,以某种方式规范化您的名称可能是有意义的(例如,删除所有特殊字符,然后将其应用于 pages_text 和您的字符串列表。

def normalize_str(some_str):
    some_str = some_str.lower()
    for c in """-?'"/{}[]()&!,.`""":
        some_str = some_str.replace(c,"")
    return some_str

如果这还不够好,您可以转到difflib并执行以下操作:

for client in normalized_client_names:
    closest_client = difflib.get_closest_match(client_name, webpage_text,1,0.8)
    if len(closest_client) > 0:
         print client_name, "found as", closest_client[0]

我选择的任意截止(Ratcliff/Obershelp)比率 0.8 可能过于宽松或过于严格;玩一下。

于 2011-05-25T01:22:37.383 回答