【问题标题】:How do I open a webpage with BeautifulSoup and output a text file?如何使用 BeautifulSoup 打开网页并输出文本文件?
【发布时间】:2013-10-02 01:11:24
【问题描述】:

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

我试过下面的脚本:

from bs4 import BeautifulSoup
import urllib2

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

我该怎么做?

【问题讨论】:

  • "所有字母...包含字母 M" ??
  • 信件,例如,您通过邮件发送的东西?
  • 请把问题说清楚。

标签: python python-3.x beautifulsoup


【解决方案1】:

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

为此,您需要通过调用

来解析内容中的 html
BeautifulSoup(content)

更多信息on the beautiful soup website

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

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 承认艾布拉姆斯声称很多 他 更多 娱乐 衡量 收入 就业 环境 更多 大多数在家的男人声称“大使馆”女人在家的时间被取消了……更多“气候 来自家中的男人家庭 Money Minute 可能有很多黄金时段

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

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

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

做小得多的豪宅小得多 AM承认艾布拉姆斯声称很多 他 更多 娱乐 衡量 收入 就业 环境 更多 大多数玛格丽特杰出女性的时间国歌更多气候男人家庭来自 主页 Money Minute may 的更多内容 黄金时段 Money Minute may 许多黄金时段

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

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

会写出包含m的单词,用空格隔开。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多