【问题标题】:Retrieve string values with list使用列表检索字符串值
【发布时间】:2020-08-23 16:59:31
【问题描述】:

我在这里尝试操作一些字符串时遇到了一些问题。我正在从网站上抓取一些数据,我面临两个挑战:

  1. 我正在抓取不必要的数据,因为我的目标网站有多余的类命名。我的目标是隔离这些数据并将其删除,这样我就可以只保留我感兴趣的数据。

  2. 保留数据后,我需要拆分字符串以便将一些信息存储到特定变量中。

所以最初我打算使用一个简单的split() 函数并将每个新字符串存储到列表中,然后使用它来保留我想要的部分。不幸的是,每次我这样做时,我都会得到 3 个无法操作/拆分的单独列表。

代码如下:

from selenium import webdriver
from bs4 import BeautifulSoup


driver = webdriver.Chrome('\\Users\\rapha\\Desktop\\10Milz\\4. Python\\Python final\\Scrape\\chromedriver.exe')
driver.get("https://www.atptour.com/en/scores/2020/7851/MS011/match-stats")

content = driver.page_source
soup = BeautifulSoup(content, "html.parser" )

for infos in soup.find_all('h3', class_='section-title'):
    title = infos.get_text()
    title = ' '.join(title.split()) 
    title_list = []
    title_list = title.split(" | ")
    print(title_list)

这里是“原始数据”检索

Player Results
Tournament Results
Salvatore Caruso VS. Brandon Nakashima | Indian Wells 2020

这就是我想要实现的目标

Variable_1 = Salvatore Caruso
Variable_2 = Brandon Nakashima 
Variable 3 = Indian Wells 
Variable 4 = 2020

您能告诉我如何在这里进行吗?

【问题讨论】:

    标签: python python-3.x string list


    【解决方案1】:

    这个怎么样?

    它不是那么漂亮,但只要有一个 VS 就可以工作。和一个 |分隔名称,并且年份的日期始终为 4 位数字。

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    
    driver = webdriver.Chrome('/home/lewis/Desktop/chromedriver')
    driver.get("https://www.atptour.com/en/scores/2020/7851/MS011/match-stats")
    
    content = driver.page_source
    soup = BeautifulSoup(content, "html.parser" )
    
    text = soup.find_all('h3', class_='section-title')[2].get_text().replace("\n","")
    while text.find("  ")> -1:
        text = text.replace("  "," ")
    text = text.strip()
    #split by two parameters
    split = [st.split("|") for st in text.split("VS.")]
    #flatten the nested lists
    flat_list = [item for sublist in split for item in sublist]
    #extract the date from the end of the last item
    flat_list.append(flat_list[-1][-4:])
    #remove date fromt the 3rd item
    flat_list[2] = flat_list[2][:-4]
    #strip any leading or trailing white space
    final_list = [x.strip() for x in flat_list]
    
    print(final_list)
    

    输出

    ['Salvatore Caruso', 'Brandon Nakashima', 'Indian Wells', '2020']
    

    【讨论】:

    • 谢谢你,这很有帮助,并且确实回答了部分挑战。话虽如此,你从正确的字符串开始。我遇到的一个问题是我无法删除其他 2 个(['Player Results'] ['Tournament Results']),我总是最终同时处理 3 个并且不能专门使用你在你的例子。我该怎么办?
    • 我已经更新了 :) 如果对您有帮助,请接受我的回答。
    • 我刚刚检查了更新,但不幸的是,初始字符串仍然不像废料返回的字符串。您正在使用一个包含 3 个元素的唯一字符串,而废品返回 3 个我实际上几乎无法合并或分离的自主字符串。如果您使用我的代码并打印标题变量的类型,您会看到它返回 3 个字符串,但我不能专门针对每个字符串来分隔它们或合并它们。
    • 看,当使用你的代码时,我最终会遇到与使用我的代码相同的问题,它返回从分隔字符串块继承的分隔列表。这是在“flat_list = [item for sublist in split for item in sublist]”行之后发生的情况:['Player Results', 'ults'] ['Tournament Results', 'ults'] ['Salvatore Caruso', ' Brandon Nakashima ', ' Indian Wells 2020', '2020'] 然后,目标索引 [2] 不起作用;唯一有效的索引是 [0]
    • 仍然是同样的问题:/(我还假设它最初来自空格和反斜杠,但似乎没有什么区别)
    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多