Python, разделение неформатированной подстроки из строки в список - PullRequest
0 голосов
/ 12 июля 2020

Есть ли простой способ разделить:

R 24     -50 (1948 — 1950)R 25     -56 (1950 — 1956)R 26     -60 (1955 — 1960)R 27     -66 (1960 — 1966)R 50     -69 (1955 — 1969)R 51     -54 (1950 — 1953)R 60     -69 (1956 — 1969)R 67     -55 (1951 — 1955)R 68     -54 (1952 — 1954)R 69     -69 (1955 — 1969)R50/5-R90S 69-76 (1969 — 1980)R45-R65LS..78-85 (1978 — 1985)R 60, R 75 , R 80, /7, RT (76-85) (1976 — 1985)R 65 GS, R 80 G/S, R 80 ST (80-92) (1980 — 1992)R 65, R 65 RT, R 80, R 80 RT (85-95) (1984 — 1995)R 80 GS, R 100 GS, PD (87-90) (1986 — 1990)R 80 GS, R 100 GS, PD (90-95) (1990 — 1996)R 80 GS Basic (96) (1996 — 1996)R 80 R, R 100 R, Mystik (91-95) (1991 — 1996)R 100, /7, /T, CS, RS, RT, S (76-84) (1976 — 1984)R 100 RS, R 100 RT (87-95) (1986 — 1995)K589 (K1, K 100 RS) (1988 — 1993)K589 (K100, RS, RT, LT) (1982 — 1991)K569 (K 75, K 75 C, K 75 S, K 75 RT) (1984 — 2005)A10B08 (87-97) (1987 — 1996)

все подстроки, которые на самом деле заканчиваются (19wx - 19yz)

, в список, который должен выглядеть так:

['R 24     -50 (1948 — 1950)',
'R 25     -56 (1950 — 1956)',
'R 26     -60 (1955 — 1960)',
'R 27     -66 (1960 — 1966)',
'R 50     -69 (1955 — 1969)',
'R 51     -54 (1950 — 1953)',
'R 60     -69 (1956 — 1969)',
'R 67     -55 (1951 — 1955)',
'R 68     -54 (1952 — 1954)',
'R 69     -69 (1955 — 1969)',
'R50/5-R90S 69-76 (1969 — 1980)',
'R45-R65LS..78-85 (1978 — 1985)',
'R 60, R 75 , R 80, /7, RT (76-85) (1976 — 1985)',
'R 65 GS, R 80 G/S, R 80 ST (80-92) (1980 — 1992)',
'R 65, R 65 RT, R 80, R 80 RT (85-95) (1984 — 1995)',
'R 80 GS, R 100 GS, PD (87-90) (1986 — 1990)',
'R 80 GS, R 100 GS, PD (90-95) (1990 — 1996)',
'R 80 GS Basic (96) (1996 — 1996)',
'R 80 R, R 100 R, Mystik (91-95) (1991 — 1996)',
'R 100, /7, /T, CS, RS, RT, S (76-84) (1976 — 1984)',
'R 100 RS, R 100 RT (87-95) (1986 — 1995)',
'K589 (K1, K 100 RS) (1988 — 1993)',
'K589 (K100, RS, RT, LT) (1982 — 1991)',
'K569 (K 75, K 75 C, K 75 S, K 75 RT) (1984 — 2005)',
'A10B08 (87-97) (1987 — 1996)']

Я пробовал множество вещей, и самый простой и близкий:

import requests
from bs4 import BeautifulSoup
import re

url = 'https://www.example.com/select?product=A&archive=B'

headers = {"User-agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')

s = soup.find(id="series").get_text()

p = 1
c = []
n = 0   

char=r"\((....)\s[-]\s(....)\)"

while p > 0:
    p = s.find(char)
    record = s[0:p+1]
    s = s.split(record,1)[1]
    print(s)
    c.insert(n,record)
    n = n+1
print(c)

, где мое регулярное выражение неверно, и когда я тестирую с помощью char = ')', чтобы пройти эту задачу и см. следующий, я заканчиваю на:

Traceback (most recent call last):
  File "/Users/chinedu/Documents/Scooters Archives/BMW/scrapping motorcycles site 1.py", line 43, in <module>
    s = s.split(record,1)[1]
ValueError: empty separator

что выглядит очевидным, но я не могу его решить

Всем спасибо

1 Ответ

0 голосов
/ 14 июля 2020

Вот как я справился с этой задачей

import requests
from bs4 import BeautifulSoup
import re

url = 'https://www.realoem.com/bmw/fr/select?product=M&archive=1'

headers = {"User-agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
s = soup.find(id="series").get_text()




#print(soup)

li = (list(s))

for n, i in enumerate(li):
    if i == '\u2003':
        li[n] = ' '

s = ''.join(li)

p = ''
c = []
n = 0   

#char=r"\((....)\s[-]\s(....)\)"
char=r"\((.{11})\)"

    
while p != 'None':
    p = re.search(char, s)
    if dir(p) == ['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']:
        break
    else:
        rc = s[0:p.end()]
        c.insert(n,rc)
        s = s.split(rc,1)[1]
        n = n + 1
print(len(c))
print(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...