Получить целые числа из списка, созданного с помощью BeautifulSoup в Python - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в Python, и мне нужна помощь по поводу этого кода:

from urllib.request import *
from bs4 import BeautifulSoup
import re

req = Request("https://adrianchifu.com/teachings/AMSE/MAG1/project/Xlrda/dsuR/2/J9ED27Y.html")
a = urlopen(req).read()
soup=BeautifulSoup(a,'html.parser')
nombres=[]
tout = (soup.find_all('td'))
str_tout=str(tout)     
tout = [float(s) for s in re.findall(r'\d+\.\d+', str_tout)]
nombres.append(tout)
print(nombres)

С веб-сайта мне нужно получить все числовые значения, содержащиеся в нем (это просто часть, содержащаяся ввесь код).Мне удалось извлечь числа, но я не могу получить целые числа.Я перепробовал много вещей, но я не понял, как это сделать.Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Для этой ссылки (https://adrianchifu.com/teachings/AMSE/MAG1/project/Xlrda/dsuR/2/9GYIGO.html), метод, указанный ниже, не работает, потому что в списке есть целые числа, числа с плавающей запятой, но также символы. И некоторая цепочкасимволы начинаются с цифры, что усложняет задачу. Как я могу поймать целые числа, но не символы, начинающиеся с цифры?

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Целые числа не имеют формы \d+\.\d+, поэтому давайте сделаем десятичную точку и цифры необязательными с помощью ^\d+(?:\.\d+)?$ (обратите внимание на группу без захвата. Это важно).

Затем я попытался бы сопоставить каждый td.text сам по себе:

req = Request("https://adrianchifu.com/teachings/AMSE/MAG1/project/Xlrda/dsuR/2/J9ED27Y.html")
a = urlopen(req).read()
soup = BeautifulSoup(a,'html.parser')
nombres = []
tds = soup.find_all('td')
for td in tds:
    if re.match(r'^\d+(?:\.\d+)?$', td.text):
        nombres.append(float(td.text))
print(nombres)

Это выводит

[89.169, 54.893, 19.212, 87.045, 2.248, 99.947, 6190.0, 83.096]

В качестве последнего улучшения я бы использовалсоставьте список с помощью скомпилированного регулярного выражения, чтобы немного улучшить производительность:

req = Request("https://adrianchifu.com/teachings/AMSE/MAG1/project/Xlrda/dsuR/2/J9ED27Y.html")
a = urlopen(req).read()
soup = BeautifulSoup(a,'html.parser')
tds = soup.find_all('td')
numbers_regex = re.compile(r'^\d+(?:\.\d+)?$')
nombres = [float(td.text) for td in tds if numbers_regex.match(td.text)]
0 голосов
/ 03 декабря 2018

Вы должны продолжать делать все по-своему, и вы можете выполнить свою работу, используя split.

from urllib.request import *
from bs4 import BeautifulSoup
import re

req = Request("https://adrianchifu.com/teachings/AMSE/MAG1/project/Xlrda/dsuR/2/J9ED27Y.html")
a = urlopen(req).read()
soup = BeautifulSoup(a,'html.parser')
nombres = []
tout = [ele.text for ele in soup.find_all('td')]
tout = [text if not re.findall(r"^\d+\.\d+",text) else int(text.split(".")[0]) for text in tout]
print(tout)
# [89, 54, 19, 'OIK3XF02PS', 87, 2, 99, '6190', 83, 'E2RYAFAE']
0 голосов
/ 02 декабря 2018

Если вы ищете регулярное выражение для сопоставления целых чисел.

^ [1-9] [0-9] {0,2} $

Все положительные ненулевые целые числа между1 и 999. Вы можете настроить верхний диапазон этого выражения, изменив второе число (т. Е. 2) в части выражения {0,2}.

Courtsy: http://regexlib.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...