考虑这个简单的例子
df = pd.DataFrame({'link' : ['https://en.wikipedia.org/wiki/World%27s_funniest_joke',
'https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World']})
df
Out[169]:
link
0 https://en.wikipedia.org/wiki/World%27s_funniest_joke
1 https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World
我想使用beautiful soup
解析每个链接,并将解析后的内容存储到数据帧的另一列中。以下几点似乎效果不错:
def puller(mylink):
doc = requests.get(mylink)
return BeautifulSoup(doc.content, 'html5lib')
df['parsed'] = df.apply(lambda x: puller(x))
df['mytag'] = df.parsed.apply(lambda x: x.find_all('p'))
问题是,我正在获取列表,我需要处理其中的文本。特别是,我试图在文本中只保留提到joke
的段落,但我无法做到这一点
def extractor(mylist):
return list(filter(lambda x: re.search('joke', x), mylist))
df.mytag.apply(lambda x: extractor(x))
TypeError: expected string or bytes-like object
在这里最好的方法是什么
谢谢
熊猫api设计用于更原始的数据类型;您最好编写一个转换链接的函数->;您需要的文本,然后调用
apply
。这里有一个解决方案:输出:
使用dataframe,您可以更合理地将字符串列表转换为行:
结果:
df[mytag]
的每个条目都是一个美丽的'<p>'
元素的列表。您可以编写一个函数,获取此列表并返回包含您的单词的文本。然后使用.apply
覆盖df[mytag]
让它在所有行上工作编辑:
你问题中的错误反映了上面斜体字提到的事实。re.search需要字符串作为参数。换句话说,该函数调用中的
x
必须是字符串或类似字节的对象。在本例中,它是作为单个<p>
元素的BeautifulSoup对象。该错误可以通过将元素的字符串文本获取为x.text
来解决相关问题 更多 >
编程相关推荐