我有大约一百万个网页列表,我想高效地从这些网页中提取文字。目前,我在python中使用BeautifulSoup库从HTML获取文本,并使用request命令获取网页的html。这种方法除了提取文本之外还提取了一些额外的信息,例如正文中是否列出了任何javascript。
您能否建议我任何合适且有效的方式来完成任务。我看着草木,但看起来像是在爬特定的网站。我们可以通过它的特定网页列表来获取信息吗?
谢谢。
答案 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]+')