<b>之后和之前的BeautifulSoup Parse Text

时间:2017-06-04 15:15:13

标签: python html beautifulsoup

我有这个代码试图从授权网站解析搜索结果(请在代码中找到URL,我不能发布链接,直到我的代表更高),“年”和“金额奖”之后标签和标签之前。

enter image description here

两个问题:

1)为什么这只返回第一张桌子?

2)我可以通过任何方式获得在(即年份和金额奖励字符串)之后的文本和(即2015年和100000美元等实际数字)

具体做法是:

<td valign="top">
				            <b>Year: </b>2014<br>
				            <b>Award Amount: </b>$84,907				                                				                                				        </td>

这是我的剧本:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'http://www.ned.org/wp-content/themes/ned/search/grant-search.php?' \
    'organizationName=&region=ASIA&projectCountry=China&amount=&fromDate=&toDate=&' \
    'projectFocus%5B%5D=&search=&maxCount=25&orderBy=Year&start=1&sbmt=1'

r = requests.get(url)

html_content = r.text

soup = BeautifulSoup(html_content, "html.parser")

tables = soup.find_all('table')


data = {
        'col_names': [],
        'info' : [],
        'year_amount':[]
        }


index = 0

for table in tables:
    rows = table.find_all('tr')[1:]
    for row in rows:
        cols = row.find_all('td')
        data['col_names'].append(cols[0].get_text())
        data['info'].append(cols[1].get_text())
        try:
            data['year_amount'].append(cols[2].get_text())
        except IndexError:
            data['year_amount'].append(None)
    grant_df = pd.DataFrame(data)
    index += 1
    filename = 'grant ' + str(index) + '.csv'
    grant_df.to_csv(filename)

1 个答案:

答案 0 :(得分:1)

我建议以不同的方式处理表格解析。所有信息都可在每个表的第一行中找到。因此,您可以解析行的文本,如:

代码:

text = '\n'.join([x.strip() for x in rows[0].get_text().split('\n')
                  if x.strip()]).replace(':\n', ': ')
data_dict = {k.strip(): v.strip() for k, v in
             [x.split(':', 1) for x in text.split('\n')]}

如何?

这需要文本和

  1. 将其拆分为换行符
  2. 删除所有空行
  3. 删除任何前导/尾随空格
  4. 将这些行重新连接成一个文本
  5. 以[{1}}结尾的任何行加入下一行
  6. 然后:

    1. 通过换行符再次拆分文本
    2. 将每一行拆分为:
    3. 删除:
    4. 两侧文本末尾的任何空格
    5. 将拆分文本用作:
    6. 的键和值

      测试代码:

      dict

      结果:

      import requests
      from bs4 import BeautifulSoup
      import pandas as pd
      
      url = 'http://www.ned.org/wp-content/themes/ned/search/grant-search.php?' \
            'organizationName=&region=ASIA&projectCountry=China&amount=&' \
            'fromDate=&toDate=&projectFocus%5B%5D=&search=&maxCount=25&' \
            'orderBy=Year&start=1&sbmt=1'
      
      r = requests.get(url)
      soup = BeautifulSoup(r.text, "html.parser")
      
      data = []
      for table in soup.find_all('table'):
          rows = table.find_all('tr')
          text = '\n'.join([x.strip() for x in rows[0].get_text().split('\n')
                            if x.strip()]).replace(':\n', ': ')
          data_dict = {k.strip(): v.strip() for k, v in
                       [x.split(':', 1) for x in text.split('\n')]}
      
          if data_dict.get('Award Amount'):
              data.append(data_dict)
      grant_df = pd.DataFrame(data)
      print(grant_df.head())