也许,这会更接近您可能尝试提取的内容,我猜,其表达式类似于:
(?is)<strong>\s*([^<]*?)\s*<\/strong>
或者,
(?is)(?<=<strong>)\s*[^<]*?\s*(?=<\/strong>)
很确定,您也可以使用 bs4 内置函数来做到这一点。
测试 1
from bs4 import BeautifulSoup
import urllib
import re
import requests
url = 'https://www.cars.com/for-sale/searchresults.action/?zc=92617&rd=10&stkTypId=28881&mkId=28263&searchSource=RESEARCH_SHOP_INDEX'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'lxml')
all_matches = soup.find_all(
'div', {'class': 'shop-srp-listings__listing-container'})
for each in all_matches:
info = each.findAll('ul', class_='listing-row__meta')
matches = re.findall(
r'(?is)<strong>\s*[^<]*?\s*<\/strong>\s*([^<]*?)\s*<', str(info[0]))
for match in matches:
print(match)
输出 1
Gray
Beige
Automatic
AWD
Gray
White
Automatic
AWD
Black
测试 2
如果你愿意,你也可以通过一些修改来制作一个 dict:
from bs4 import BeautifulSoup
import urllib
import re
import requests
url = 'https://www.cars.com/for-sale/searchresults.action/?zc=92617&rd=10&stkTypId=28881&mkId=28263&searchSource=RESEARCH_SHOP_INDEX'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'lxml')
all_matches = soup.find_all(
'div', {'class': 'shop-srp-listings__listing-container'})
for each in all_matches:
info = each.findAll('ul', class_='listing-row__meta')
matches = dict(re.findall(
r'(?is)<strong>\s*([^<]*?)\s*<\/strong>\s*([^<]*?)\s*<', str(info[0])))
for k, v in matches.items():
print(f'{k} {v}')
输出 2
Ext. Color: Gray
Int. Color: Beige
Transmission: Automatic
Drivetrain: AWD
Ext. Color: Gray
Int. Color: White
Transmission: Automatic
Drivetrain: AWD
Ext. Color: Black
测试 3
如果您想列出:
from bs4 import BeautifulSoup
import urllib
import re
import requests
url = 'https://www.cars.com/for-sale/searchresults.action/?zc=92617&rd=10&stkTypId=28881&mkId=28263&searchSource=RESEARCH_SHOP_INDEX'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'lxml')
all_matches = soup.find_all(
'div', {'class': 'shop-srp-listings__listing-container'})
for each in all_matches:
info = each.findAll('ul', class_='listing-row__meta')
matches = re.findall(
r'(?is)<strong>\s*([^<]*?)\s*<\/strong>\s*([^<]*?)\s*<', str(info[0]))
for match in matches:
print(list(match))
输出
['Transmission:', 'Automatic']
['Drivetrain:', 'RWD']
['Ext. Color:', 'Gray']
['Int. Color:', 'Gray']
['Transmission:', 'Automatic']
['Drivetrain:', 'RWD']
['Ext. Color:', 'White']
['Int. Color:', 'Black']
['Transmission:', 'Automatic']
['Drivetrain:', 'RWD']
['Ext. Color:', 'White']
['Int. Color:', 'Beige']
['Transmission:', 'Automatic']
['Drivetrain:', 'AWD']
['Ext. Color:', 'Gray']
['Int. Color:', 'Beige']
['Transmission:', 'Automatic']
['Drivetrain:', 'AWD']
['Ext. Color:', 'White']
测试 4
from bs4 import BeautifulSoup
import urllib
import re
import requests
url = 'https://www.cars.com/for-sale/searchresults.action/?zc=92617&rd=10&stkTypId=28881&mkId=28263&searchSource=RESEARCH_SHOP_INDEX'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'lxml')
all_matches = soup.find_all(
'div', {'class': 'shop-srp-listings__listing-container'})
keys = ['Ext. Color', 'Int. Color', 'Transmission', 'Drivetrain']
outputs = dict()
for each in all_matches:
info = each.findAll('ul', class_='listing-row__meta')
matches = dict(re.findall(
r'(?is)<strong>\s*([^<:]*?)\s*:\s*<\/strong>\s*([^<]*?)\s*<', str(info[0])))
for item in matches.items():
if item[0] not in outputs:
outputs[item[0]] = [item[1]]
if item[0] in keys:
outputs[item[0]].append(item[1])
输出 4
{'分机。颜色:['银色','银色','白色','白色','黑色','灰色',
'灰色','黑色','黑色','白色','蓝色','红色','银色','灰色',
'黑色','白色','黑色','灰色','白色','黑色','黑色'],'诠释。
颜色:['米色','米色','黑色','白色','黑色','黑色','灰色',
'米色','黑色','黑色','米色','米色','黑色','黑色',
'黑色','黑色','黑色','黑色','白色','白色','黑色'],
'传输':['自动','自动','自动','自动',
“自动”、“自动”、“自动”、“自动”、“自动”、
“自动”、“自动”、“自动”、“自动”、“自动”、
“自动”、“自动”、“自动”、“自动”、“自动”、
'自动','自动'],'传动系统':['AWD','AWD','AWD','AWD',
'RWD','RWD','RWD','RWD','AWD','RWD','RWD','RWD','AWD','RWD',
'RWD'、'AWD'、'RWD'、'AWD'、'AWD'、'AWD'、'AWD']}
测试 5
from bs4 import BeautifulSoup
import urllib
import re
import requests
url = 'https://www.cars.com/for-sale/searchresults.action/?zc=92617&rd=10&stkTypId=28881&mkId=28263&searchSource=RESEARCH_SHOP_INDEX'
response = requests.get(url)
page = response.text
soup = BeautifulSoup(page, 'lxml')
all_matches = soup.find_all(
'div', {'class': 'shop-srp-listings__listing-container'})
keys = ['Ext. Color', 'Int. Color', 'Transmission', 'Drivetrain']
outputs = dict()
for each in all_matches:
info = each.findAll('ul', class_='listing-row__meta')
matches = dict(re.findall(
r'(?is)<strong>\s*([^<:]*?)\s*:\s*<\/strong>\s*([^<]*?)\s*<', str(info[0])))
for item in matches.items():
if item[0] not in outputs:
outputs[item[0]] = [item[1]]
if item[0] in keys:
outputs[item[0]].append(item[1])
print(outputs)
print('*' * 50)
no_duplicate_outputs = dict()
for item in outputs.items():
if item[0] not in no_duplicate_outputs:
no_duplicate_outputs[item[0]] = list(set(item[1]))
print(no_duplicate_outputs)
输出 5
{'分机。颜色:['黑色','黑色','白色','黑色','其他','灰色',
'白色','白色','灰色','白色','灰色','银色','蓝色','黑色',
'银色','银色','黑色','蓝色','蓝色','黑色','白色'],'诠释。
颜色:['黑色','黑色','米色','米色','黑色','灰色','黑色',
'米色','米色','白色','黑色','黑色','灰色','黑色','黑色',
'灰色','黑色','黑色','黑色','白色','黑色'],'传输':
['自动','自动','自动','自动','自动',
“自动”、“自动”、“自动”、“自动”、“自动”、
“自动”、“自动”、“自动”、“自动”、“自动”、
“自动”、“自动”、“自动”、“自动”、“自动”、
'自动'], '传动系统': ['AWD', 'AWD', 'RWD', 'RWD', 'RWD', 'RWD',
'RWD','AWD','AWD','AWD','RWD','AWD','AWD','AWD','AWD','AWD',
'RWD'、'AWD'、'AWD'、'AWD'、'AWD']}
****************************************************** {'分机。颜色:['银色','白色','蓝色','其他','黑色','灰色'],'诠释。颜色':
['米色','白色','黑色','灰色'],'传输':['自动'],
'传动系统':['RWD','AWD']}
如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入相匹配。
正则表达式电路
jex.im 可视化正则表达式: