如何分离和替换特定的刮字符串?
How to seperate and replace specific scraped strings?
我想从 <dd>
和 <dt>
中清理被抓取的文本,输出如下所示:
Įrengimas:': 'Dalinė apdailaNAUDINGA:Interjero dizaineriai', 'Ypatybės:': 'Nauja kanalizacijaNauja elektros instaliacija',
我想要的输出:
Įrengimas:': 'Dalinė apdaila, 'Ypatybės:': 'Nauja kanalizacija, Nauja elektros instaliacija',
我的代码块,获取该文本:
def get_dl(soup):
d_list = {}
for dl in soup.findAll("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = el.get_text(strip=True)
return d_list
那么,在这种情况下修复文本的最佳做法是什么?
添加完整代码,查看全貌:
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import csv
PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(PATH)
data = []
def get_dl(soup):
d_list = {}
for dl in soup.findAll("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = el.get_text(strip=True)
return d_list
for puslapis in range(2, 3):
driver.get(f'https://www.aruodas.lt/butai/vilniuje/puslapis/{puslapis}')
response = driver.page_source
soup = BeautifulSoup(response, 'html.parser')
blocks = soup.find_all('tr', class_='list-row')
stored_urls = []
for url in blocks:
try:
stored_urls.append(url.a['href'])
except:
pass
for link in stored_urls:
driver.get(link)
response = driver.page_source
soup = BeautifulSoup(response, 'html.parser')
h1 = soup.find('h1', 'obj-header-text')
price = soup.find('div', class_ = 'price-left')
try:
address1 = h1.get_text(strip=True)
address2 = re.findall(r'(.*),[^,]*$', address1)
address = ''.join(address2)
city, district, street = address.split(',')
except:
address = 'NaN'
try:
full_price = price.find('span', class_ = 'price-eur').text.strip()
except:
full_price = 'NaN'
try:
price_sq_m = price.find('span', class_ = 'price-per').text.strip()
except:
price_sq_m = 'NaN'
try:
price_change = price.find('div', class_ = 'price-change').text.strip()
except:
price_change = 'NaN'
data.append({'city': city, 'district': district, 'street': street, 'full_price': full_price, 'price_sq_m': price_sq_m, 'price_change:': price_change, **get_dl(soup)})
for entry in data:
print(entry)
driver.quit()
拉巴斯。 “Naudinga”部分是主要问题吗,是否还有其他 words/phrases 可能发生?如果没有,试试这个。
#Replace your line code:
d_list[key] = el.get_text(strip=True)
#With this mess:
d_list[key] = ' '.join(el.text.strip().replace("\n", ", ").split('NAUDINGA')[0].split())
如果只有一个字符串到 replace()
最短的方法是使用 get_text()
及其参数来剥离和 join
/ 用空格分隔位:
d_list[key] = el.get_text(' ', strip=True).replace(' NAUDINGA: Interjero dizaineriai','')
如果有多个字符串,我会建议使用 stripped_strings
,什么几乎相同,以及 list comprehension
来检查/排除不需要的字符串:
d_list[key] = ' '.join([e for e in list(el.stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
基于您的函数的示例
def get_dl(soup):
d_list = {}
for dl in soup.find_all("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = ' '.join([e for e in list(el.stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
return d_list
示例输出:
{'Namo numeris:': '10', 'Plotas:': '35,08 m²', 'Kambarių sk.:': '2', 'Aukštas:': '1', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '10', 'Plotas:': '50,97 m²', 'Kambarių sk.:': '2', 'Aukštas:': '5', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Papildomos patalpos:': 'Balkonas', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '10', 'Plotas:': '47,25 m²', 'Kambarių sk.:': '2', 'Aukštas:': '4', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Papildomos patalpos:': 'Balkonas', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '55', 'Plotas:': '34,8 m²', 'Kambarių sk.:': '1', 'Aukštas:': '8', 'Aukštų sk.:': '9', 'Metai:': '1988', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis', 'Įrengimas:': 'Įrengtas', 'Ypatybės:': 'Nauja kanalizacija Nauja elektros instaliacija Internetas', 'Papildomos patalpos:': 'Sandėliukas Balkonas Drabužinė', 'Papildoma įranga:': 'Skalbimo mašina Su baldais Šaldytuvas Virtuvės komplektas Viryklė Plastikiniai vamzdžiai Indaplovė Dušo kabina', 'Apsauga:': 'Šarvuotos durys Signalizacija Kodinė laiptinės spyna'}
以防万一,您也可以使用 css selectors
到 select 更具体的元素:
def get_dl(soup):
d_list = {}
for el in soup.select('dl.obj-details dt:has(+dd)'):
key = el.get_text(strip=True)
if key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = ' '.join([e for e in list(el.find_next('dd').stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
return d_list
我想从 <dd>
和 <dt>
中清理被抓取的文本,输出如下所示:
Įrengimas:': 'Dalinė apdailaNAUDINGA:Interjero dizaineriai', 'Ypatybės:': 'Nauja kanalizacijaNauja elektros instaliacija',
我想要的输出:
Įrengimas:': 'Dalinė apdaila, 'Ypatybės:': 'Nauja kanalizacija, Nauja elektros instaliacija',
我的代码块,获取该文本:
def get_dl(soup):
d_list = {}
for dl in soup.findAll("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = el.get_text(strip=True)
return d_list
那么,在这种情况下修复文本的最佳做法是什么?
添加完整代码,查看全貌:
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import csv
PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(PATH)
data = []
def get_dl(soup):
d_list = {}
for dl in soup.findAll("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = el.get_text(strip=True)
return d_list
for puslapis in range(2, 3):
driver.get(f'https://www.aruodas.lt/butai/vilniuje/puslapis/{puslapis}')
response = driver.page_source
soup = BeautifulSoup(response, 'html.parser')
blocks = soup.find_all('tr', class_='list-row')
stored_urls = []
for url in blocks:
try:
stored_urls.append(url.a['href'])
except:
pass
for link in stored_urls:
driver.get(link)
response = driver.page_source
soup = BeautifulSoup(response, 'html.parser')
h1 = soup.find('h1', 'obj-header-text')
price = soup.find('div', class_ = 'price-left')
try:
address1 = h1.get_text(strip=True)
address2 = re.findall(r'(.*),[^,]*$', address1)
address = ''.join(address2)
city, district, street = address.split(',')
except:
address = 'NaN'
try:
full_price = price.find('span', class_ = 'price-eur').text.strip()
except:
full_price = 'NaN'
try:
price_sq_m = price.find('span', class_ = 'price-per').text.strip()
except:
price_sq_m = 'NaN'
try:
price_change = price.find('div', class_ = 'price-change').text.strip()
except:
price_change = 'NaN'
data.append({'city': city, 'district': district, 'street': street, 'full_price': full_price, 'price_sq_m': price_sq_m, 'price_change:': price_change, **get_dl(soup)})
for entry in data:
print(entry)
driver.quit()
拉巴斯。 “Naudinga”部分是主要问题吗,是否还有其他 words/phrases 可能发生?如果没有,试试这个。
#Replace your line code:
d_list[key] = el.get_text(strip=True)
#With this mess:
d_list[key] = ' '.join(el.text.strip().replace("\n", ", ").split('NAUDINGA')[0].split())
如果只有一个字符串到 replace()
最短的方法是使用 get_text()
及其参数来剥离和 join
/ 用空格分隔位:
d_list[key] = el.get_text(' ', strip=True).replace(' NAUDINGA: Interjero dizaineriai','')
如果有多个字符串,我会建议使用 stripped_strings
,什么几乎相同,以及 list comprehension
来检查/排除不需要的字符串:
d_list[key] = ' '.join([e for e in list(el.stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
基于您的函数的示例
def get_dl(soup):
d_list = {}
for dl in soup.find_all("dl", {"class": "obj-details"}):
for el in dl.find_all(["dt", "dd"]):
if el.name == 'dt':
key = el.get_text(strip=True)
elif key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = ' '.join([e for e in list(el.stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
return d_list
示例输出:
{'Namo numeris:': '10', 'Plotas:': '35,08 m²', 'Kambarių sk.:': '2', 'Aukštas:': '1', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '10', 'Plotas:': '50,97 m²', 'Kambarių sk.:': '2', 'Aukštas:': '5', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Papildomos patalpos:': 'Balkonas', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '10', 'Plotas:': '47,25 m²', 'Kambarių sk.:': '2', 'Aukštas:': '4', 'Aukštų sk.:': '5', 'Metai:': '2022', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis kolektorinis', 'Įrengimas:': 'Dalinė apdaila', 'Pastato energijos suvartojimo klasė:': 'A++', 'Papildomos patalpos:': 'Balkonas', 'Apsauga:': 'Šarvuotos durys Kodinė laiptinės spyna Vaizdo kameros'}
{'Namo numeris:': '55', 'Plotas:': '34,8 m²', 'Kambarių sk.:': '1', 'Aukštas:': '8', 'Aukštų sk.:': '9', 'Metai:': '1988', 'Pastato tipas:': 'Mūrinis', 'Šildymas:': 'Centrinis', 'Įrengimas:': 'Įrengtas', 'Ypatybės:': 'Nauja kanalizacija Nauja elektros instaliacija Internetas', 'Papildomos patalpos:': 'Sandėliukas Balkonas Drabužinė', 'Papildoma įranga:': 'Skalbimo mašina Su baldais Šaldytuvas Virtuvės komplektas Viryklė Plastikiniai vamzdžiai Indaplovė Dušo kabina', 'Apsauga:': 'Šarvuotos durys Signalizacija Kodinė laiptinės spyna'}
以防万一,您也可以使用 css selectors
到 select 更具体的元素:
def get_dl(soup):
d_list = {}
for el in soup.select('dl.obj-details dt:has(+dd)'):
key = el.get_text(strip=True)
if key in ['Plotas:', 'Buto numeris:', 'Metai:', 'Namo numeris:', 'Kambarių sk.:', 'Aukštas:', 'Aukštų sk.:', 'Pastato tipas:', 'Šildymas:', 'Įrengimas:', 'Pastato energijos suvartojimo klasė:', 'Ypatybės:', 'Papildomos patalpos:', 'Papildoma įranga:', 'Apsauga:']:
d_list[key] = ' '.join([e for e in list(el.find_next('dd').stripped_strings) if e not in ['NAUDINGA:','Interjero dizaineriai']])
return d_list