如何在没有额外信息的情况下有效地从一堆网页中提取文本

时间:2019-05-22 08:28:16

标签: java python web-scraping beautifulsoup scrapy

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

您能否建议我任何合适且有效的方式来完成任务。我看着草木,但看起来像是在爬特定的网站。我们可以通过它的特定网页列表来获取信息吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

是的,您可以使用Scrapy以通用的方式对一组URL进行爬网。

您只需要在Spider的start_urls列表属性上设置它们,或重新实现start_requests Spider方法以从任何数据源产生请求,然后实现parse回调执行所需的常规内容提取。

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

答案 1 :(得分:0)

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

要从通用页面提取文本,我只遍历正文,不包括注释等,以及一些脚本,样式等标记:

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]+')