Как использовать BeautifulSoup4, чтобы получить ВСЕ текст перед тегом <br>во фрейме данных pandas - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь извлечь почтовый индекс и пригород Сиднея в качестве информационного кадра, просматривая веб-сайт

Я нашел соответствующий тег в Beautifulsup, но не могу завершить процесс

import requests
from bs4 import BeautifulSoup

url = 'https://data.mongabay.com/igapo/australia/postcodes/sydney-numeric.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html5lib')

table = soup.find_all('table')[10]

rows = table.find_all('td')[2]

for br in rows.find_all("br"):
    br.replace_with("\n")

parsedText = rows.get_text()

Я ожидаю фрейм данных, такой как:

postcode suburbs
2000 Australia Square Post Office
2000 Circular Quay
2000 Clarence Street Post Office
...

спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы сделали почти всю работу!Вы просто должны прочитать его правильно.

from io import StringIO
import re

pd.read_csv(StringIO(parsedText), sep= r'(?<=\d) ', header = None, engine = 'python')

Поэтому нам нужно использовать StringIO, чтобы сделать ваш текст читаемым с помощью pd.read_csv, затем мы можем сделать некоторое регулярное выражение для определения нашего разделителя.

r'(?<=\d) ' ищет пробел (обратите внимание на пробел после ')'), если перед ним стоит цифра.

0 голосов
/ 29 мая 2019

Несколько многословный метод. bs4 4.7.1

import requests
import pandas as pd
​
url = 'https://data.mongabay.com/igapo/australia/postcodes/sydney-numeric.html'
r = requests.get(url, headers = {'User-Agent' : 'Mozilla/5.0'})
soup = bs(r.content, 'lxml')
codes = []
names = []
​
for line in soup.select_one('h1:contains("Postal codes") ~ font [size="2"]').text.split('\n'):
    if line[:4]:
        codes.append(line[:4]), names.append(line[5:])
df = pd.DataFrame(list(zip(codes, names)), columns = ['code', 'name'])

​
...