python - 将 URL 参数解析为单独的列
问题描述
我有一个带有 URL 列的数据框,如果 URL 中存在指定参数的值,我想根据指定参数的值将其解析为带有行的新列。我正在使用一个函数,该函数循环遍历数据框列中的每一行并解析指定的 URL 参数,但是当我在函数完成后尝试选择该列时,我得到一个 keyError。我应该以不同的方式将值设置为这个新列吗?有没有比遍历表中的值并运行此过程更有效的方法?
错误:
KeyError: 'utm_source'
示例网址 ( df['landing_page_url']
):
https://lp.example.com/test/lp
https://lp.example.com/test/ny/?utm_source=facebook&ref=test&utm_campaign=ny-newyork_test&utm_term=nice
https://lp.example.com/test/ny/?utm_source=facebook
NaN
https://lp.example.com/test/la/?utm_term=lp-test&utm_source=facebook
代码:
import pandas as pd
import numpy as np
import math
from urllib.parse import parse_qs, urlparse
def get_query_field(url, field):
if isinstance(url, str):
try:
return parse_qs(urlparse(url).query)[field][0]
except KeyError:
return ''
else:
return ''
for i in df['landing_page_url']:
print(i) // returns URL
print(get_query_field(i, 'utm_source')) // returns proper values
df['utm_source'] == get_query_field(i, 'utm_source')
df['utm_campaign'] == get_query_field(i, 'utm_campaign')
df['utm_term'] == get_query_field(i, 'utm_term')
解决方案
代替
try:
return parse_qs(urlparse(url).query)[field][0]
except KeyError:
return ''
你可以这样做:
return parse_qs(urlparse(url).query).get(field, [''])[0]
这里的诀窍是my_dict.get(key, default)
代替my_dict[key]
. 如果 key 不存在,将返回默认值
有没有比遍历表中的值并运行此过程更有效的方法?
并不真地。无论哪种方式,都必须遍历每个 url。但现在,您正在覆盖每个 url 的数据框。这意味着如果两个不同的 URL 在查询中具有不同的来源,则列表中的最后一个将获胜。我不知道这是不是故意的。
另请注意:这一行
df['utm_source'] == get_query_field(i, 'utm_source')
实际上是没有做任何事情。==
是一个比较运算符,“左侧是否与右侧匹配”。您可能打算使用=
或df.append({'utm_source': get_query_field(..)})
推荐阅读
- flutter - 如何使用键盘完成按钮 Flutter、observable、streamBuilder 实现验证
- docker - 如何在我的计算机上本地托管 Web 应用程序
- c++ - 为什么读取缓冲区时 read() 会无限期阻塞
- next.js - NextJS 动态 urls 查询不传回 ID
- r - 展开为空白并取消嵌套
- javascript - 当 npm 开始使用 express 和 nodemon 时应用程序崩溃
- php - WordPress: Add page to Yoast SEO breadcrumbs
- python - 两个for循环的优化
- gradle - 没有可用于离线模式的 com.android.tools.build:aapt2:3.6.1-6040484 缓存版本
- python - 如何从列表的每个元素中创建一个变量?