#python #html #pandas #web-scraping #split
#python #HTML #pandas #очистка веб-страниц #разделить
Вопрос:
Я определяю функцию, которая очищает HTML, помещает выходные данные в список и разделяет данные на ", "
. Тем не менее, я хочу разделить этот список на оба "n"
и ", "
. Пока я могу делать только одно или другое, но не одновременно. Вот мой код.
#libraries
from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
#function
def scrape_html(url):
body = []
reqs = requests.get(url)
soup = BeautifulSoup(urlopen(url).read())
for tag in soup.find_all('body'):
new_line=soup.get_text('n')
body.append(new_line)
comma_split=[i.split(', ') for i in body]
return comma_split
Вывод разделяется запятой, но "n"
остается.
#output
[['{"Last Name": "SMITH"',
'"First Name": "JOHN"',
'"Annual Salary": "100,000.00"}nRequest: John Smithn{"Last Name": "WYLIE"',
'"First Name": "SAM"', ...]]
Любая помощь была бы оценена!
Комментарии:
1. Добро пожаловать в SO! Вы имеете дело с JSON здесь? Какой URL извлекается или как выглядит разметка?
2. @ggorlen спасибо! да, объект JSON. Вот пример URL: uchicago.computer/…
3. Хорошо, почему бы не использовать
json.loads(string)
вместо того, чтобы пытаться запустить свой собственный анализатор?4. @ggorlen хорошая мысль! еще не слишком знаком с библиотекой JSON, поэтому я решил придерживаться того, что я (вроде) знаю. Конечная цель состоит в том, чтобы разделить разделенные значения списка на их собственные строки в фрейме данных pandas.
5. Я вижу, что API не возвращает JSON. Возможно, вы захотите заглянуть в API, чтобы посмотреть, сможете ли вы получить полезный ответ. Просто имейте в виду, что если одна из строк содержит новую строку или запятую, принятое вами решение прерывается. Удачи.
Ответ №1:
Вы можете использовать re.split
для более мощного механизма разделения:
#libraries
from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
import re
#function
def scrape_html(url):
body = []
reqs = requests.get(url)
soup = BeautifulSoup(urlopen(url).read())
for tag in soup.find_all('body'):
new_line=soup.get_text('n')
body.append(new_line)
comma_split=[re.split('(?:n|, )', i) for i in body]
return comma_split
Здесь (?:)
просто означает отсутствие захвата, а n|,
соответствует либо новой строке, либо запятой, за которой следует строка.
Комментарии:
1. @ggorlen, просто отвечаю на первоначальный вопрос
2. JSON также работает только с одним объектом в строке:
json.loads('{"a":"b"}n{"a":"b"}')
не сработает3. Да, оказывается, OP не работает с JSON, но должно быть лучшее решение, чем регулярное выражение. Проблема XY , я говорю…
4. @ggorlen Я согласен. Я думаю, что разделение с помощью шаблона регулярных выражений такого рода
nRequest sent:
могло бы работать намного лучше.5. Да, но это зависит от природы API. Кто знает, можно ли на это положиться, поэтому у OP есть дополнительные объяснения / исследования. В любом случае спасибо за помощь, надеюсь, это поможет им.