使用美丽的汤

时间:2018-01-10 17:31:22

标签: python pandas web-scraping beautifulsoup

我是python的新手(三天),我偶然发现了一个我无法用google / youtube解决的问题。我想抓取National Governors Association获取所有美国州长的背景数据并将其保存到csv文件中。

我已经设法清除了所有调控器的列表,但为了获得更多细节,我需要单独进入每个调控器的页面并保存数据。我在网上找到了代码建议,利用“下一步”按钮或网址结构循环遍历多个网站。但是,该网站没有下一个按钮,并且url-links不遵循loopable结构。所以我被困住了。

我很感激我能得到的任何帮助。我想在每个州长页面中提取主要文本(“地址”标签中的“办公室日期”,“学校”等)上方的信息,例如在this one中。

这是我到目前为止所得到的:

import bs4 as bs
import urllib.request
import pandas as pd

url = 'https://www.nga.org/cms/FormerGovBios?begincac77e09-db17-41cb-9de0-687b843338d0=10&endcac77e09-db17-41cb-9de0-687b843338d0=9999&pagesizecac77e09-db17-41cb-9de0-687b843338d0=10&militaryService=&higherOfficesServed=&religion=&lastName=&sex=Any&honors=&submit=Search&college=&firstName=&party=&inOffice=Any&biography=&warsServed=&'

sauce = urllib.request.urlopen(url).read()
soup = bs.BeautifulSoup(sauce, "html.parser")

#dl list of all govs
dfs = pd.read_html(url, header=0)
for df in dfs:
    df.to_csv('governors.csv')

#dl links to each gov
table = soup.find('table', 'table table-striped table-striped')
links = table.findAll('a')
with open ('governors_links.csv', 'w') as r:
    for link in links:
        r.write(link['href'])
        r.write('\n')
    r.close()

#enter each gov page and extract data in the "address" tag(s)
#save this in a csv file

2 个答案:

答案 0 :(得分:1)

我假设您已获得名为links的列表中的所有链接。
您可以这样做以逐个获取所有州长所需的数据:

for link in links:
    r = urllib.request.urlopen(link).read()
    soup = bs.BeautifulSoup(r, 'html.parser')
    print(soup.find('h2').text)  # Name of Governor
    for p in soup.find('div', {'class': 'col-md-3'}).findAll('p'):
        print(p.text.strip())  # Office dates, address, phone, ...
    for p in soup.find('div', {'class': 'col-md-7'}).findAll('p'):
        print(p.text.strip())  # Family, school, birth state, ...

修改:

将您的links列表更改为

links = ['https://www.nga.org' + x.get('href') for x in table.findAll('a')]

答案 1 :(得分:1)

这可能有用。自从我上班以来,我还没有完全测试它,但它应该是你的起点。

choco install ruby --version 2.4.3.1