【问题标题】:Converting scraped text into Pandas data frame with BeautifulSoup使用 BeautifulSoup 将抓取的文本转换为 Pandas 数据框
【发布时间】:2017-03-29 00:22:41
【问题描述】:

我正在使用下面的代码从网站中提取一些文本。我有它的字符串形式。

import requests
URL = 'https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655&SSO=1'
r = requests.get(URL)
page = r.text

from bs4 import BeautifulSoup
soup = BeautifulSoup(page, 'lxml')
import re

strong_el = soup.find('strong',text='WHAT RESPONDENTS ARE SAYING …')

ul_tag = strong_el.find_next_sibling('ul')
LI_TAG =''
for li_tag in ul_tag.children:

    LI_TAG += li_tag.string

print LI_TAG

我正在尝试创建一个包含 2 列的数据框:1)评论 2)行业(括号内的子字符串)。 当我尝试使用StringIO 时出现一些错误,如下所示:'TypeError: data argument can't be an iterator'。如何将这些 cmets 转换为数据框?

import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

import pandas as pd

LI_TAG = StringIO(LI_TAG)
df = pd.DataFrame(LI_TAG)

【问题讨论】:

    标签: python pandas dataframe beautifulsoup stringio


    【解决方案1】:

    看起来 LI_TAG 变量只是一个长字符串 - 因此您必须将其拆分以将其存储在数据帧中。

    import requests
    URL = 'https://www.instituteforsupplymanagement.org/about/MediaRoom/newsreleasedetail.cfm?ItemNumber=30655&SSO=1'
    r = requests.get(URL)
    page = r.text
    
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(page, 'lxml')
    import re
    
    strong_el = soup.find('strong',text='WHAT RESPONDENTS ARE SAYING …')
    
    ul_tag = strong_el.find_next_sibling('ul')
    LI_TAG =''
    for li_tag in ul_tag.children:
    
        LI_TAG += li_tag.string
    
    # Convert to unicode to remove quotation marks \u201c and \u201d
    LI_TAG_U = unicode(LI_TAG)
    comments=[]
    industries=[]
    for string in LI_TAG.strip().split('\n'):
        comment, industry =  string.split(u'\u201d')
        comments.append(comment.strip(u'\u201c'))
        industries.append(industry.strip(' (').strip(')'))
    
    import pandas as pd
    
    data = pd.DataFrame()
    
    data['Comment']=comments
    data['Industry']=industries
    

    希望这对你有用!

    【讨论】:

    • cmets=[], Industries=[] 在 for 循环之后定义。改变了它。现在它起作用了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多