【问题标题】:How can I efficiently extract text from bunch for web pages without extra information如何在没有额外信息的情况下有效地从一堆网页中提取文本
【发布时间】:2019-05-22 08:28:16
【问题描述】:

我有大约 100 万个网页列表,我想有效地从这些页面中提取文本。目前我在 python 中使用 BeautifulSoup 库从 HTML 中获取文本,并使用请求命令来获取网页的 html。除了文本之外,这种方法还会提取一些额外的信息,例如是否在正文中列出了任何 javascript。

您能否建议我任何合适且有效的方式来完成这项任务。我查看了scrapy,但它看起来像是在抓取特定的网站。我们可以将特定网页的列表传递给它以获取信息吗?

提前谢谢你。

【问题讨论】:

  • 你好 Samresh。首先,您需要找到一种至少适用于一页的方法,然后尝试找到一种适用于您的百万页的有效方法。 Scrapy 不会为您带来任何在内容方面比 requests 和 beautifulsoup 提供更好结果的神奇方法。如果你对这些结果感到满意,你可以在 scrapy 上做基本相同的事情,它将帮助你并行化请求。如果您对使用 beautifoulsoup 的结果不满意,请注意您的问题根本不容易解决。
  • 但是“我查看了scrapy,但它看起来像是在抓取特定的网站”是不正确的,当然您可以传递特定网页的列表:docs.scrapy.org/en/latest/intro/overview.html(请参阅 start_urls 属性)

标签: java python web-scraping beautifulsoup scrapy


【解决方案1】:

是的,您可以使用 Scrapy 以通用方式抓取一组 URL。

您只需在您的蜘蛛的start_urls 列表属性上设置它们,或重新实现start_requests 蜘蛛方法以产生来自任何数据源的请求,然后实现您的parse 回调以执行通用内容提取你想要的。

您可以使用html-text 从中提取文本,并使用常规的 Scrapy 选择器来提取您提到的其他数据。

【讨论】:

    【解决方案2】:

    在 scrapy 中,您可以设置自己的解析器。例如。美丽的汤。您可以从 parse 方法调用此解析器。

    为了从通用页面中提取文本,我只遍历正文,排除 cmets 等以及一些标签,如脚本、样式等:

    for snippet in soup.find('body').descendants:
        if isinstance(snippet, bs4.element.NavigableString) \
                and not isinstance(snippet, EXCLUDED_STRING_TYPES)\
                and snippet.parent.name not in EXCLUDED_TAGS:
            snippet = re.sub(UNICODE_WHITESPACES, ' ', snippet)
            snippet = snippet.strip()
            if snippet != '':
                snippets.append(snippet)
    

    EXCLUDED_STRING_TYPES = (bs4.Comment, bs4.CData, bs4.ProcessingInstruction, bs4.Declaration)
    EXCLUDED_TAGS = ['script', 'noscript', 'style', 'pre', 'code']
    UNICODE_WHITESPACES = re.compile(u'[\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f \x85\xa0\u1680\u2000\u2001\u2002\u2003\u2004'
                                     u'\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2014-08-15
      • 2021-04-09
      • 1970-01-01
      • 2017-09-04
      • 2019-04-03
      • 1970-01-01
      相关资源
      最近更新 更多