关于寻找两本词典交集的最佳方法的建议

2024-05-02 10:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前也发布过一个类似的问题,但在修改了项目之后,我发现:

有两个csv文件(新建.csv刮刀.csv)-

新建.csv包含一列:
'url'=整个url sampleinput

刮刀.csv包含两列:
'scraper\u dom'=特定URL域的简化
'scraper\u id'=用于将URL导入单独管理的数据库的关联scraper\u id

scrapers.csv

问题

我的目标是迭代新建.csv(使用urlparse解析出fnetloc),并在上执行查找刮刀.csv返回一组匹配的'scraper\u id'给定一组'url'(VLOOKUP的工作方式,或SQL中的连接),一旦urlparse做了,就需要在URL中隔离netloc(结果是fnetloc)。你知道吗

我的下一个大问题是urlparse不解析url(来自新建.csv)中找到的精确简化刮刀.csv文件,所以我将依赖于一种部分匹配,直到我能够找出用于该部分的正则表达式。你知道吗

我已经导入了pandas,因为以前的尝试发现我创建了数据帧并执行了pd.merge,但是我也无法让它工作。。。你知道吗

当前代码,底部注释掉的部分是失败的尝试,我只是想包括我迄今为止尝试过的内容。
##只是我放进去检查程序输出的中间print行)

import pandas as pd, re
from urllib.parse import urlparse
import csv
sd = {}
sid = {}
#INT = []
def fnetloc(any):
    try:
        p = urlparse(any)
        return p.netloc
    except IndexError:
        return 'Error'
def dom(any):
    try:
        r = any.split(',')
        return r[0]
    except IndexError:
        return 'Error'
def ids(any):
    try:
        e = any.split(',')
        return e[0]
    except IndexError:
        return 'Error'

with open('scrapers.csv',encoding='utf-8',newline='') as s:
    reader = enumerate(csv.reader(s))
    s.readline()
    for j, row in reader:
        dict1 = dict({'scraper_dom':dom(row[0]), 'scraper_id':ids(row[1])})
        sid[j + 1] = dict1
for di in sid.keys():
    id = di
    ##print(sid[di]['scraper_dom'],sid[di]['scraper_id'])

with open('new.csv',encoding='UTF-8',newline='') as f:
    reader = enumerate(csv.reader(f))
    f.readline()
    for i, row in reader:
        dict2 = dict({'scraper_domain': fnetloc(row[0])})
        sd[i + 1] = dict2
for d in sd.keys():
    id = d
    ##print(sd[d]['scraper_domain'])

    #def tryme(  ):
        #return filter(sd.has_key, sid)
    #print(list(filter(sid, sd.keys())))

所需输出的样本。你知道吗

sampleoutput


Tags: csvidurlreturnanysdscraperdom
1条回答
网友
1楼 · 发布于 2024-05-02 10:53:43

您只需要一个过程,该过程可以获取一个fnetloc和一个scraper列表,并检查是否有与该fnetloc匹配的scraper:

def fnetloc_to_scraperid(fnetloc: str, scrapers: List[Scraper]) -> str:
    try:
        return next(x.scraper_id for x in scrapers if x.matches(fnetloc))
    except:
        return "[no scraper id found]"

我还建议您使用一些类,而不是将所有内容都保存在csv行对象中,从长远来看,这样可以减少代码中的错误,并大大提高您的理智。你知道吗

这个脚本处理了我输入的示例数据:

import csv
from urllib.parse import urlparse
from typing import List

def fnetloc(any) -> str:
    try:
        p = urlparse(any)
        return p.netloc
    except IndexError:
        return 'Error'

class Scraper:
    def __init__(self, scraper_dom: str, scraper_id: str):
        self.scraper_dom = scraper_dom
        self.scraper_id = scraper_id
    def matches(self, fnetloc: str) -> bool:
        return fnetloc.endswith(self.scraper_dom)


class Site:
    def __init__(self, url: str):
        self.url = url
        self.fnetloc = fnetloc(url)
    def get_scraperid(self, scrapers: List[Scraper]) -> str:
        try:
            return next(x.scraper_id for x in scrapers if x.matches(self.fnetloc))
        except:
            return "[no scraper id found]"

sites = [Site(row[0]) for row in csv.reader(open("new.csv"))]
scrapers = [Scraper(row[0], row[1]) for row in csv.reader(open("scrapers.csv"))]

for site in sites:
    print(site.url, site.get_scraperid(scrapers), sep="\t")

相关问题 更多 >