【发布时间】:2021-03-26 05:06:42
【问题描述】:
我在 Google 表格中有单元格:
我需要单独的价格,地址:
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) 只取第一个值?