【问题标题】:Using BeautifulSoup & for loop to extract data使用 BeautifulSoup & for 循环提取数据
【发布时间】:2020-04-01 22:11:55
【问题描述】:

我无法使用 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')]

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

【问题讨论】:

    标签: python beautifulsoup python-requests


    【解决方案1】:

    您在源代码中有一个<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))
    

    【讨论】:

    • 这成功了!太感谢了!现在,BeautifulSoup 会创建一个包含一个元素的列表,然后您必须找到子元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多