我想清理從<dd>and中抓取的文本<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()
uj5u.com熱心網友回復:
拉巴斯。“Naudinga”部分是主要問題嗎,還有其他可能出現的單詞/短語嗎?如果沒有,試試這個。
#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())
uj5u.com熱心網友回復:
如果只有一個字串到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 m2', '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 m2', '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 m2', '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 m2', '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選擇更具體的元素:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473911.html
上一篇:如何檢查字串是否為字母數字?
下一篇:明智地連接兩個字串元素
