import requests
from bs4 import BeautifulSoup
from datetime import datetime
from dateutil.relativedelta import relativedelta

evr_begin = datetime.now().strftime("%m/%d/%Y")
evr_end = (datetime.now() + relativedelta(months=1)).strftime("%m/%d/%Y")
url = "https://mms.kcbs.us/members/evr_search_ol_json.php?" \
      f"otype=TEXT&evr_map_type=2&org_id=KCBA&evr_begin={evr_begin}&evr_end=. 
      {evr_end}&" \
      "evr_radius=50&evr_type=269&evr_region_type=1"
response = requests.request("GET", url)
soup = BeautifulSoup(response.text, features='lxml')
for event in soup.find_all('div', class_='row'):
    print(event.find('b').getText())
    print(event.find('i').getText())

链接到网站https://mms.kcbs.us/members/evr_search.php?org_id=KCBA

我不确定如何打印我已经打印的信息之后的内容.问题的一部分是其他一些文本共享相同的标签,而其他文本我只是不确定.

例如,对于我需要打印的第一个事件

科罗拉多州弗里斯科80443

all separately.
If i use print(event.find('div', class_='col-md-4').getText()) within the for loop it will print it clumped together

推荐答案

我要做的是创建一个字典,其中包含不同数据段的所有名称,这些数据段按照它们在表的每一行中出现的顺序映射.然后将每一行收集到它自己的字典中,并将它们附加到列表中,以便在解析完成后处理.

例如:

import requests
from bs4 import BeautifulSoup
from datetime import datetime
from dateutil.relativedelta import relativedelta
import json

data = {
    0:{ 0:"title", 1:"dates", 2:"city/state", 3:"country" },
    1:{ 0:"event", 1:"reps", 2:"prize" },
    2:{ 0:"results" }
}

evr_begin = datetime.now().strftime("%m/%d/%Y")
evr_end = (datetime.now() + relativedelta(months=1)).strftime("%m/%d/%Y")
url = f"https://mms.kcbs.us/members/evr_search_ol_json.php?otype=TEXT&evr_map_type=2&org_id=KCBA&evr_begin={evr_begin}&evr_end=.{evr_end}&evr_radius=50&evr_type=269&evr_region_type=1"
response = requests.request("GET", url)
print(response.content)
soup = BeautifulSoup(response.text, features='lxml')
all_data = []
for element in soup.find_all('div', class_="row"):
    event = {}
    for i, col in enumerate(element.find_all('div', class_='col-md-4')):
        for j, item in enumerate(col.strings):
            event[data[i][j]] = item
    all_data.append(event)

print(json.dumps(all_data,indent=4))

输出如下所示:

 {
        "title": "Frisco BBQ Challenge",
        "dates": "6/16/2022 - 6/18/2022",
        "city/state": "Frisco, CO 80443",
        "country": "UNITED STATES",
        "event": "STATE CHAMPIONSHIP",
        "reps": "Reps: BUNNY TUTTLE, RICH TUTTLE, MICHAEL WINTER",
        "prize": "Prize Money: $13,050.00",
        "results": "Results Not In"
    },
    {
        "title": "York County BBQ Festival",
        "dates": "6/17/2022 - 6/18/2022",
        "city/state": "Delta, PA 17314",
        "country": "UNITED STATES",
        "event": "STATE CHAMPIONSHIP",
        "reps": "Reps: ANGELA MCKEE, ROBERT MCKEE, LOUISE WEIDNER",
        "prize": "Prize Money: $5,500.00",
        "results": "Results Not In"
    },
...

Python相关问答推荐

scikit-learn导入无法导入名称METRIC_MAPPING64'

基于字符串匹配条件合并两个帧

数据抓取失败:寻求帮助

django禁止直接分配到多对多集合的前端.使用user.set()

将输入聚合到统一词典中

python中字符串的条件替换

使用NeuralProphet绘制置信区间时出错

如何在Python中使用另一个数据框更改列值(列表)

如何杀死一个进程,我的Python可执行文件以sudo启动?

替换现有列名中的字符,而不创建新列

使用__json__的 pyramid 在客户端返回意外格式

如何在Python中使用Iscolc迭代器实现观察者模式?

将链中的矩阵乘法应用于多组值

在Python中控制列表中的数据步长

在第一次调用时使用不同行为的re. sub的最佳方式

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

对数据帧进行分组,并按组间等概率抽样n行

将相应的值从第2列合并到第1列(Pandas )

将时间序列附加到数据帧

获取每行NumPy最大出现次数的所有值