Pandas 如何使用pd.DataFrame方法从使用beautifulsoup4获取的信息手动创建数据帧

Pandas 如何使用pd.DataFrame方法从使用beautifulsoup4获取的信息手动创建数据帧,pandas,web-scraping,beautifulsoup,Pandas,Web Scraping,Beautifulsoup,我做到了这一点,所有的tr数据都被刮去了,我能够得到一个很好的打印输出。但是当我去实现pd.DataFrame如df=pd.DataFrame({“A”:A})等时,我得到了一个语法错误 以下是我在Jupyter笔记本中导入的库的列表: import pandas as pd import numpy as np import bs4 as bs import requests import urllib.request import csv import html5lib from panda

我做到了这一点,所有的
tr
数据都被刮去了,我能够得到一个很好的打印输出。但是当我去实现
pd.DataFrame
df=pd.DataFrame({“A”:A})
等时,我得到了一个语法错误

以下是我在Jupyter笔记本中导入的库的列表:

import pandas as pd
import numpy as np
import bs4 as bs
import requests
import urllib.request
import csv
import html5lib
from pandas.io.html import read_html
import re
这是我的密码:

source = urllib.request.urlopen('https://www.zipcodestogo.com/Texas/').read()
soup = bs.BeautifulSoup(source,'html.parser')

table_rows = soup.find_all('tr')
table_rows

for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    print(row)

texas_info = pd.DataFrame({
        "title": Texas 
        "Zip Code" : [Zip Code], 
        "City" :[City],
})

texas_info.head()

我希望得到一个包含两列的数据框,一列是“邮政编码”,另一列是“城市”

尝试创建数据框并执行for循环,将表中的每一行附加到数据框中

df=pd.DataFrame()
对于表_行中的tr:
td=tr.find_all('td'))
row=[i.text代表td中的i]
打印(行)
zipCode=行[0]#假设为第一列
城市=第[1]行#假设第二列
追加({“Zip Code”:zipCode,“City”:City},忽略_index=True)

如果只需要这两列,则不应在数据框中包含
title
(这将创建另一列);由于缺少逗号,该行也恰好出现语法错误。

尝试创建数据帧并执行
for
循环,将表中的每一行追加到数据帧中

df=pd.DataFrame()
对于表_行中的tr:
td=tr.find_all('td'))
row=[i.text代表td中的i]
打印(行)
zipCode=行[0]#假设为第一列
城市=第[1]行#假设第二列
追加({“Zip Code”:zipCode,“City”:City},忽略_index=True)

如果只需要这两列,则不应在数据框中包含
title
(这将创建另一列);由于缺少逗号,该行也恰好出现语法错误。

如果要手动创建,可以使用bs4 4.7.1使用
:not
:contains
:nth类型的
伪类来隔离两个感兴趣的列,然后构造一个dict,然后转换为df

import pandas as pd
import urllib
from bs4 import BeautifulSoup as bs

source = urllib.request.urlopen('https://www.zipcodestogo.com/Texas/').read()
soup = bs(source,'lxml')
zips = [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(1):not([colspan])')]
cities =  [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(2):not([colspan])')]
d = {'Zips': zips,'Cities': cities}
df = pd.DataFrame(d)
df = df[1:].reset_index(drop = True)
您可以将选择器组合成一行:

import pandas as pd
import urllib
from bs4 import BeautifulSoup as bs

source = urllib.request.urlopen('https://www.zipcodestogo.com/Texas/').read()
soup = bs(source,'lxml')
items = [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(1):not([colspan]), .inner_table:contains(Texas) td:nth-of-type(2):not([colspan])')]
d = {'Zips': items[0::2],'Cities': items[1::2]}
df = pd.DataFrame(d)
df = df[1:].reset_index(drop = True)
print(df)

我注意到您希望手动创建,但值得将来的读者了解的是,您可以只使用pandas read_html

import pandas as pd

table = pd.read_html('https://www.zipcodestogo.com/Texas/')[1]
table.columns = table.iloc[1]
table = table[2:]
table = table.drop(['Zip Code Map', 'County'], axis=1).reset_index(drop=True)
print(table)

如果要手动创建,可以使用bs4 4.7.1使用
:not
:contains
:nth类型的
伪类来隔离感兴趣的两列,然后构造一个dict,然后转换为df

import pandas as pd
import urllib
from bs4 import BeautifulSoup as bs

source = urllib.request.urlopen('https://www.zipcodestogo.com/Texas/').read()
soup = bs(source,'lxml')
zips = [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(1):not([colspan])')]
cities =  [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(2):not([colspan])')]
d = {'Zips': zips,'Cities': cities}
df = pd.DataFrame(d)
df = df[1:].reset_index(drop = True)
您可以将选择器组合成一行:

import pandas as pd
import urllib
from bs4 import BeautifulSoup as bs

source = urllib.request.urlopen('https://www.zipcodestogo.com/Texas/').read()
soup = bs(source,'lxml')
items = [item.text for item in soup.select('.inner_table:contains(Texas) td:nth-of-type(1):not([colspan]), .inner_table:contains(Texas) td:nth-of-type(2):not([colspan])')]
d = {'Zips': items[0::2],'Cities': items[1::2]}
df = pd.DataFrame(d)
df = df[1:].reset_index(drop = True)
print(df)

我注意到您希望手动创建,但值得将来的读者了解的是,您可以只使用pandas read_html

import pandas as pd

table = pd.read_html('https://www.zipcodestogo.com/Texas/')[1]
table.columns = table.iloc[1]
table = table[2:]
table = table.drop(['Zip Code Map', 'County'], axis=1).reset_index(drop=True)
print(table)

追加操作非常慢,每次都会重新分配空间。最好创建dict,填充它,然后从dictAppend创建数据帧。这是一个非常缓慢的操作,每次都会重新分配空间。最好创建dict,填充它,然后从dict创建数据帧。您是如何决定在read_html方法中使用什么索引值的?这是基于“检查元件”的信息吗“我这样问是因为我这次试图在另一个网站上复制这个过程,但我没有得到类似的结果。read_html带回了它可以抓取的所有表,所以我检查了这些表,直到找到了正确的索引。还有其他的方法,比如在循环中检查想要的头。你是如何决定在read_html方法中使用什么索引值的?这是基于“检查元件”的信息吗“我这样问是因为我这次试图在另一个网站上复制这个过程,但我没有得到类似的结果。read_html带回了它可以抓取的所有表,所以我检查了这些表,直到找到了正确的索引。还有其他的方法,比如在循环中检查想要的头。