Python3 BeautifulSoup返回连接的字符串

时间:2016-12-31 03:19:29

标签: python python-3.x web-scraping beautifulsoup

一旦找到它,我试图从这个HTML中提取一个演员列表

actors_anchor = soup.find('a', href = re.compile('Actor&p'))
parent_tag = actors_anchor.parent
next_td_tag = actors_anchor_parent.findNext('td')

next_td_tag

<font size="2">Wes Bentley<br><a href="/people/chart/
?view=Actor&amp;id=brycedallashoward.htm">Bryce Dallas Howard</a><br><a
href="/people/chart/?view=Actor&amp;id=robertredford.htm">Robert        
Redford</a><br><a href="/people/chart/ view=Actor&amp;id=karlurban.htm">Karl Urban</a></br></br></br></font>

问题在于,当我拉动文本时,它返回一个字符串,名称之间没有空格

print(next_td_tag.get_text())
'''this returns'''
'Wes BentleyBryce Dallas HowardRobert RedfordKarl Urban'

我需要将这些名称放入一个列表,其中每个名称都是分开的     ['Wes Bentley','Bryce Dallas Howard','Robert Redford','Karl Urban']

任何建议都是非常有必要的。

3 个答案:

答案 0 :(得分:1)

您可以使用stripped_strings将所有字​​符串作为列表

html = '''<td><font size="2">Wes Bentley<br><a href="/people/chart/
?view=Actor&amp;id=brycedallashoward.htm">Bryce Dallas Howard</a><br><a
href="/people/chart/?view=Actor&amp;id=robertredford.htm">Robert Redford</a><br><a href="/people/chart/ view=Actor&amp;id=karlurban.htm">Karl Urban</a></br></br></br></font></td>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')

next_td_tag = soup.find('td')

print(list(next_td_tag.stripped_strings))

结果

['Wes Bentley', 'Bryce Dallas Howard', 'Robert Redford', 'Karl Urban']

stripped_strings是生成器,因此您可以将其与for一起使用 - 循环或使用list()获取所有元素

答案 1 :(得分:0)

找到找到的a内的所有td元素:

[a.get_text() for a in next_td_tag.find_all('a')]

这不会涵盖Wes Bentley&#34;没有a元素的文本。

我们可以采用不同的方法,并找到所有文本节点

next_td_tag.find_all(text=True)

您可能需要清理它并删除&#34;空&#34;项目:

texts = [text.strip().replace("\n", " ") for text in next_td_tag.find_all(text=True)]
texts = [text for text in texts if text]
print(texts)

会打印:

['Wes Bentley', 'Bryce Dallas Howard', 'Robert Redford', 'Karl Urban']

答案 2 :(得分:0)

import bs4

html = '''<font size="2">Wes Bentley<br><a href="/people/chart/
?view=Actor&amp;id=brycedallashoward.htm">Bryce Dallas Howard</a><br><a
href="/people/chart/?view=Actor&amp;id=robertredford.htm">Robert        
Redford</a><br><a href="/people/chart/ view=Actor&amp;id=karlurban.htm">Karl Urban</a></br></br></br></font>'''

soup = bs4.BeautifulSoup(html, 'lxml')

text = soup.get_text(separator='|') # concat the stings by separator 
# 'Wes Bentley|Bryce Dallas Howard|Robert        \nRedford|Karl Urban'
split_text = text.replace('        \n', '').split('|') # than split string in separator.
# ['Wes Bentley', 'Bryce Dallas Howard', 'RobertRedford', 'Karl Urban']

# do it one line 
list_text = soup.get_text(separator='|').replace('        \n', '').split('|')

或使用字符串生成器来避免手动将字符串拆分为列表:

[i.replace('        \n', '') for i in soup.strings]