【问题标题】:split list to diferent cells in Google Sheets将列表拆分到 Google 表格中的不同单元格
【发布时间】:2021-03-26 05:06:42
【问题描述】:

我在 Google 表格中有单元格:

enter image description here

我需要单独的价格,地址:

Name1 = 1run,Name2 = 价格,Name3 = 地址,Name4 = 消息

我有这个代码(问题是Find specific <li> in <div><ul>):

print(" ".join(c.getText(strip=True) for c in cena))

它打印(我在插入到 GS 时使用它)如:价格地址在一个单元格中

如何做到这一点,仅将价格打印到 Name2 列,然后第二次打印(或插入)到 Name3?

编辑:

我用于运行 .py 脚本的这段代码:

import gspread
import requests
import datetime 
from bs4 import BeautifulSoup
from oauth2client.service_account import ServiceAccountCredentials
from datetime import timedelta
import time

datetime.datetime.now()

stranka =1
stranka_1 = '/'

scope = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]


while stranka < 5:
    URL = 'url_address_here' + stranka_1
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')

    #headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0'}
    #response = requests.get(URL, headers=headers)

    pocet_bytu = 0

    #Google Sheet
    data = ServiceAccountCredentials.from_json_keyfile_name("data.json", scope)
    client = gspread.authorize(data)
    sheet = client.open("rrfile).worksheet('site_name_sheet')
    data = sheet.get_all_records()

    #log
    sheet2 = client.open("rrfile").worksheet('LOG')
    data = sheet2.get_all_records()

    insertRow = ["site, "START: " + str(datetime.datetime.now().strftime('%d-%m-%Y ve %H:%M:%S'))]
    sheet2.insert_row(insertRow,2)

    #Scraping web site
    results = soup.find_all('li', attrs={'class':'list-items__item'})
    for job_data in results:
        n = job_data.find('a', attrs={'class':'js-simulate-link-target'})
        n_final = n.text.strip()

        url = job_data.find('a', attrs={"class":"js-simulate-link-target"})
        url_pred_final = url.get('href')
        url_final = "site_url" + url_pred_final

        cena = job_data.select(".list-items__content__in > ul > li")

        pocet_bytu += 1

        #přidání řádku do sheetu
        insertRow = ["site", n_final,'', " ".join(c.getText(strip=True) for c in cena), str(pocet_bytu), url_final]
        
        print(insertRow)
        sheet.insert_row(insertRow,2)

    insertRow = ["site", "KONEC: " + str(datetime.datetime.now().strftime('%d-%m-%Y ve %H:%M:%S'))]
    sheet2.insert_row(insertRow,2)
    stranka +=1
    stranka_1 = '/page-' + str(stranka) + '/'
    print(stranka_1)
    print(URL)
    time.sleep(60)

输出是:

站点,n_value,'',价格地址,1,url

但我需要拆分价格并将它们单独寻址到单元格,所以我需要输出:

网站、n_value、''、价格、地址、1、网址

当我有一个值时,有没有办法在 inserRow 中拆分(你可以看到有问题的 - 如何获得这些值的价格、地址)?

编辑2: 网页上有 10 个这个元素。另一个在下一页。仅更改价格和地址 - 但每个代码都相同。

<div class="list-items__content list-items__content__1">
            <div class="list-items__content__in">
                <a href="#" class="in-heart js-heart " data-tooltip="Přidat do oblíbených" onclick="toggleFavorite(8826547, this)">
                    <i class="icon icon__heart-grey"></i>
                </a>
            </div>

            <div class="list-items__content__in">
                                    <h2 class="list-items__item__title list-items__item__title__1" itemprop="name">
                        <a href="url" itemprop="url" class="js-simulate-link-target" onclick="return loadPropertyToModal(8826547);" title="some text">
                            some another text</a>
                    </h2>
<!--                -->
<!--                <p>--><!--</p>-->

                <ul>
                    <li>
                        price1                    </li>

<!--                    -->                    <li>
<!--                        --><!-- Kč/m<sup>2</sup>-->
                        Address1</li>
<!--                    -->                </ul>
            </div>
        </div>

编辑: 尝试来自@Nikko J. 的回答:

当我尝试您的代码时,它会打印我所有值的价格和来自网站的所有值的地址。我的意思是:

一个块元素有price1...address1。 第二个块元素有 price2...address2。 . . .

所以输出是这样的:

['site', 1, '', price1, address1, price2, address2,..., 456654]
['site', 2, '', price1, address1, price2, address2,..., 456654]
['site', 3, '', price1, address1, price2, address2,..., 456654]
['site', 4, '', price1, address1, price2, address2,..., 456654]

我只需要打印块的价格和地址,而不是所有块的所有值,比如:

['site', 1, '', price1, address1, 456654]
['site', 2, '', price2, address2, 456654]
['site', 3, '', price3, address3, 456654]
['site', 4, '', price4, address4, 456654]

【问题讨论】:

  • 你用的是什么包?你能在你的代码中包含更多的 sn-p 吗?
  • @Nikko J. 我编辑问题。感谢您帮助我将这些(一个值)值拆分为 2 个单元格,而不是像这段代码那样。
  • 没有数据我很难调试你的代码。您可以包含网址吗?或至少page = requests.get(URL) 的输出
  • @Nikko J. 这里有问题stackoverflow.com/questions/66771267/find-specific-li-in-divul 是数据,我试图在其中获取价格和地址。但在最后我只需要拆分它们。是否有任何解决方案将它们拆分为 (" ".join(c.getText(strip=True) for c in cena))。例如 (" ".join(c.getText(strip=True) for c in cena).limit=1) 只取第一个值?

标签: python-3.x google-sheets


【解决方案1】:

" ".join(c.getText(strip=True) for c in cena) 替换为[c.getText(strip=True) for c in cena[:2]],然后将列表展平。

示例:

cena = BeautifulSoup(page.content, "html.parser").select(".list-items__content__in > ul > li")
insertRow = ["site", 1234,'',[c.getText(strip=True) for c in cena[:2]] , 456654, 32452]

def flatten_list(_2d_list):
    flat_list = []
    for element in _2d_list:
        if type(element) is list:
            for item in element:
                flat_list.append(item)
        else:
            flat_list.append(element)
    return flat_list

print('insertRow value:', insertRow)
print('Transformed Flat List:', flatten_list(insertRow))

输出:

insertRow value: ['site', 1234, '', ['2 890 000Kč', 'Address'], 456654, 32452]
Transformed Flat List: ['site', 1234, '', '2 890 000Kč', 'Address', 456654, 32452]

参考:

编辑:

据我了解,[c.getText(strip=True) for c in cena]的内容可以有多组价格和地址。

您可以使用循环 2 的 for 循环语句,并使用迭代器访问每个集合。

示例:

from bs4 import BeautifulSoup
import itertools
import datetime
text = """
<div class="list-items__content list-items__content__1">
   <div class="list-items__content__in">
      <a href="#" class="in-heart js-heart " data-tooltip="Přidat do oblíbených" onclick="toggleFavorite(8826547, this)">
      <i class="icon icon__heart-grey"></i>
      </a>
   </div>
   <div class="list-items__content__in">
      <h2 class="list-items__item__title list-items__item__title__1" itemprop="name">
         <a href="url" itemprop="url" class="js-simulate-link-target" onclick="return loadPropertyToModal(8826547);" title="some text">
         some another text</a>
      </h2>
      <ul>
         <li>
            price1
         </li>
         <li>
            Address1
         </li>
      </ul>
   </div>
</div>
<div class="list-items__content list-items__content__1">
   <div class="list-items__content__in">
      <a href="#" class="in-heart js-heart " data-tooltip="Přidat do oblíbených" onclick="toggleFavorite(8826547, this)">
      <i class="icon icon__heart-grey"></i>
      </a>
   </div>
   <div class="list-items__content__in">
      <h2 class="list-items__item__title list-items__item__title__1" itemprop="name">
         <a href="url" itemprop="url" class="js-simulate-link-target" onclick="return loadPropertyToModal(8826547);" title="some text">
         some another text</a>
      </h2>
      <ul>
         <li>
            price2
         </li>
         <li>
            Address2
         </li>
      </ul>
   </div>
</div>
"""

cena = BeautifulSoup(text, "html.parser").select(".list-items__content__in > ul > li")
test = [c.getText(strip=True) for c in cena]
site = 1
for i in range(0,len(test),2):
   data = test[i:i+2]
   insertRow = ["site", site,'', data[0], data[1] , 456654]
   site = site+1
   print('insertRow value:', insertRow)
   

输出:

insertRow value: ['site', 1, '', 'price1', 'Address1', 456654]
insertRow value: ['site', 2, '', 'price2', 'Address2', 456654]

【讨论】:

  • 非常感谢您的回答。我尝试了一下,但它每行将所有值打印到一行中。我在我的问题中添加了我的意思。
  • 每次迭代的`".join(c.getText(strip=True) for c in cena)`的内容是什么?因为我给你的解决方案是基于你的例子提供here,它只有 ['2 890 000Kč', 'Address']
  • 我将 Edit2 添加到问题中。感谢您的帮助!
  • @Triliang123 - 如果我错了,请纠正我,您的目标是在变量cena 中获取第一组价格和地址?例如在您的cena 中有price1, address1, price2, address2,您只需要price1 和address1?
  • 是的,我需要获取元素块的第一个价格和地址。在整个代码中,您可以在结果中看到 job_data: - 我尝试每个块(价格和地址以及另一个值在哪里)以获取一个行代码以插入到谷歌表格中。在我开始 skript 之后,开始逐行插入,但是使用你的代码让我得到每行的所有价格和地址。可以理解吗? :) 我知道,没有 url 地址很难说,但网站并不是对所有人公开的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多