-4

如何使用 BeautifulSoup 查找来自 yahoo.com 的所有包含字母 M 的字母并将其输出到 txt。文件?

我试过下面的脚本:

from bs4 import BeautifulSoup
import urllib2

url = "http://www.yahoo.com"     
content = urllib2.urlopen(url).read()

我该如何进行?

4

1 回答 1

4

这是一个相当模糊的问题,所以我将做出几个假设来回答它。具体来说,我假设“查找来自 yahoo.com 的所有包含字母 M 的字母”是指查找包含字母“M”的所有单词

为此,您需要通过调用来解析内容中的 html

BeautifulSoup(content)

更多关于美丽汤网站的信息

这将返回一个对象,您可以在该对象上调用方法来提取某些文本。例如

find_all('p')

将提取<p>标签中的所有文本并返回包含页面上所有段落的列表。这很有用,因为 yahoo.com 上的大部分内容都在<p>标签内。既然您已经隔离了您感兴趣的文本,您就可以搜索包含字母 M 的单词了。继续前进...

为此,我将使用正则表达式

\b[A-z]*[mM][A-z]*\b

匹配包含 M 或 m 的单词。如果要排除小写字母,可以更改[mM]为。M如果您不熟悉正则表达式,您可以在gskinner中调整它。这很酷,因为如果您将鼠标悬停在它上面,它会通过解释分解表达式。

把它们放在一起:

soup = BeautifulSoup(content)
#extract paragraphs
paragraphs = soup.find_all('p')
words = []
#iterate through paragraphs and split into individual words
for x in paragraphs:
   words = words + x.getText().split()
#match words with 'm' or 'M'
regex = re.compile(r'\b[A-z]*[mM][A-z]*\b')
words_with_m = filter(lambda i: regex.search(i), words)

当我运行它时给了我这个

变得小得多 更多 百万 大多数 AM 承认艾布拉姆斯声称他有更多 更多娱乐测量收入 就业环境 更多 大多数居家男人声称“大使馆”女人在家的时间被取消了......许多黄金时段

如您所见,您需要做更多的工作来过滤掉符号。这并不难,只需使用另一个正则表达式。

filtered = [re.sub(r'\W','',x) for x in words_with_m]

这将删除所有特殊字符。并返回

做的小得多的豪宅小得多 AM承认艾布拉姆斯声称他有很多更多娱乐测量收入就业环境更多大多数玛格丽特杰出女性时间国歌更多气候男人家庭来自家庭更多来自金钱分钟可能很多黄金时段金钱分钟可能很多黄金时段

以可写方式打开文件并写入

with open('path_to_file/file', 'w') as f:
   for x in filtered:
      f.writelines(x + ' ')

将写出包含 m 的单词,并用空格分隔。

希望这可以帮助!将来,在提出这样的开放式问题之前,我会做更多的研究。我们很乐意提供帮助,如果您清楚自己想要什么,它将帮助我们帮助您。快乐编码!

于 2013-10-02T13:42:37.137 回答