【问题标题】:What is the best way to print position of items in the list of strings using python使用python在字符串列表中打印项目位置的最佳方法是什么
【发布时间】:2019-11-23 19:14:26
【问题描述】:

我已经开始了一些网络抓取工作,而且我对 python 还是很陌生。我想在 python 的字符串列表中找到一个元素的位置。到目前为止,我已经尝试了一些语句,但 python 总是返回“bool is not iterable”。我正在使用正则表达式,并且我设法获得了有价值的东西,现在想在列表中显示匹配字符串的位置。当我使用下面的代码时,我得到如下输出:

for i in range(0, len(string_data)):
print(string_data[i])

<td class="kx o_1" data-bookmaker="16">
<td class="kx o_0" data-bookmaker="16">
<td class="kx o_2 winner" data-bookmaker="16">

在列表中找到与单词“winner”匹配的项目位置的最佳方法是什么。在我的情况下,如果我从 0 开始计数,它将是第二个位置,但我该怎么做呢?

【问题讨论】:

  • 你需要知道位置而不是仅仅获取结果吗?结果,您实际上需要什么,是否有与之相关的网址?
  • 基本上我想做的是从flashscore.com检索投注赔率,然后修改数据以帮助用户更快地导航并根据赔率做出某种预测。我需要这个位置,所以我可以知道如果获胜位置是 1,那么我只需要搜索第一个 td 等等,但我只会显示一个“获胜”奇数。

标签: python python-3.x list selenium web-scraping


【解决方案1】:

您可以使用np.where 来做到这一点。

如果您的列表包含完全您要匹配的字符串,例如:

import numpy as np
items = ['something', 'something else', 'winner']
winner_ids = np.where([item == 'winner' for item in items])

你提到了re,所以这里是你可以匹配子字符串的方法:

import numpy as np
items = ['something', 'something else', 'something containing winner']
winner_ids = np.where([re.findall('winner', item) for item in items])

注意np.where 将返回项目列表。在这两个示例中,winner_ids(array([2]),)。如果您希望找到一个获胜者,那么您可以这样做:

winner_id = winner_ids[0][0]

现在winner_id2,正如您所期望的那样。

【讨论】:

  • 天哪!我从来不知道np.where。这很棒。感谢您发布此内容。
【解决方案2】:

可能有一种更简洁、更短的方法来做到这一点,但是我们可以编写一个很好的循环来跟踪元素位置,搜索td元素的列表,一旦遇到winner,打印出那个位置:

position = 0 # start position at index 0

td_elements = driver.find_elements_by_tag_name("td") # get elements to iterate
# td_elements = driver.find_elements_by_xpath("//td[contains(@class, 'kx')]")
# ^ this is an alternate selector, in case tag_name is too generic.

# iterate td elements, searching for 'winner' in the class
for element in td_elements:

    # check if class attribute contains winner
    if ("winner" in element.get_attribute("class")):
        print(str(position) # winner! print position of element

    else: position++ # increment position if we did not find a winner

希望这会有所帮助。另一位用户使用BeautifulSoup 发布了一个解决方案,如果您已经在使用 BS,这似乎效果很好。我提供了一个纯 Selenium 示例,以防您在此处使用。

【讨论】:

    【解决方案3】:

    可以使用enumerate返回索引值:

    from bs4 import BeautifulSoup
    
    html = '''
    <td class="kx o_1" data-bookmaker="16">
    <td class="kx o_0" data-bookmaker="16">
    <td class="kx o_2 winner" data-bookmaker="16">'''
    
    soup = BeautifulSoup(html, 'html.parser')
    for idx, item in enumerate(soup.find_all('td')):
        print (idx, item['class'])
    

    输出:

    0 ['kx', 'o_1']
    1 ['kx', 'o_0']
    2 ['kx', 'o_2', 'winner']
    

    如果有赢家就返回:

    for idx, item in enumerate(soup.find_all('td')):
        if 'winner' in item['class']:
            print (idx, item['class'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2018-07-27
      • 2019-10-05
      • 1970-01-01
      相关资源
      最近更新 更多