Разделить список сразу на две вещи python

#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 есть дополнительные объяснения / исследования. В любом случае спасибо за помощь, надеюсь, это поможет им.