如何使用BeautifulSoup4将<br/>标记之前的所有文本获取到熊猫数据框中

时间:2019-05-28 20:14:40

标签: python pandas web-scraping beautifulsoup tags

我正在尝试通过抓取网站来提取邮政编码和悉尼郊区作为数据框

我已经在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 :(得分:0)

一种较为冗长的方法。 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'])

​

答案 1 :(得分:0)

您几乎完成了所有工作!您只需要正确阅读它即可。

from io import StringIO
import re

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

因此,我们需要使用StringIO使pd.read_csv可以读取您的文本,然后我们可以执行一些正则表达式来定义分隔符。

r'(?<=\d) '查找空格(注意')'后面的空格)。