繁体   English   中英

使用 BeautifulSoup & for 循环提取数据

[英]Using BeautifulSoup & for loop to extract data

我无法使用 BeautifulSoup 从网页的一部分返回所有所需的数据。 当我运行下面的 python 时,for 循环只带回它找到的第一条记录,而不是网页中的整个数据集:

import requests  
from bs4 import BeautifulSoup  
r = requests.get('https://www.ncsl.org/research/health/state-action-on-coronavirus-covid-19.aspx')
soup = BeautifulSoup(r.text, 'html.parser')  
results = soup.find_all('tbody')
records = []  
for result in results:  
    state_name = result.find('td').text
    law_Name = result.find('a').text
    law_link = result.find('a').get('href')
    law_status = result.find('b').text
    law_descr = result.find('tr').text[16:-2]
    records.append((state_name, law_Name,law_link,law_status,law_descr))

尽管我使用 for 循环遍历所有结果对象(这是一个 bs4.element.ResultSet),但记录列表中只填充了一个元素:

[('Alabama',
  'SJR 40',
  'http://alisondb.legislature.state.al.us/ALISON/SearchableInstruments/2020RS/PrintFiles/SJR40-enr.pdf',
  'Eligible for Governor.',
  ' Urges individuals to fist bump rather than shake hands. Eligible for Governor')]

任何修复我的代码的帮助将不胜感激。 谢谢!

您在源代码中有一个<tbody>标签,因此它将创建一个包含一个元素的列表。 当您尝试找到td它只会找到第一个找到的。 我想你想要一个tbody中所有<tr>的列表,并使用soup.find_all('tbody')[0].find_all('tr')顺便说一句,注意结构,有些链接没有有<b> 我认为这可以帮助您:

import requests  
from bs4 import BeautifulSoup  

r = requests.get('https://www.ncsl.org/research/health/state-action-on-coronavirus-covid-19.aspx')
soup = BeautifulSoup(r.text, 'html.parser')  
results = soup.find_all('tbody')[0].find_all('tr')
records = []
for result in results:  
    state_name = result.find('td').text
    if result.find('a'):
        law_Name = result.find('a').text
        law_link = result.find('a').get('href')
    else:
        law_Name = None
        law_link = None
    law_status = result.find('b').text if result.find('b') else None
    law_descr = result.find_all('td')[1].text[16:-2]
    records.append((state_name, law_Name,law_link,law_status,law_descr))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM