Java 如何在没有额外信息的情况下有效地从web页面中提取文本

Java 如何在没有额外信息的情况下有效地从web页面中提取文本,java,python,web-scraping,beautifulsoup,scrapy,Java,Python,Web Scraping,Beautifulsoup,Scrapy,我有大约100万个网页的列表,我想有效地从这些网页中提取文本。目前,我正在使用python中的BeautifulSoup库从HTML中获取文本,并使用请求命令获取网页的HTML。这种方法在文本之外提取一些额外的信息,比如在正文中是否列出了javascript 你能给我建议一下做这项工作的合适而有效的方法吗。我看了scrapy,但它看起来像是在特定的网站上爬行。我们是否可以将获取信息的特定网页列表传递给it部门 提前感谢。是的,您可以使用Scrapy以通用方式对一组URL进行爬网 您只需在spid

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

你能给我建议一下做这项工作的合适而有效的方法吗。我看了scrapy,但它看起来像是在特定的网站上爬行。我们是否可以将获取信息的特定网页列表传递给it部门


提前感谢。

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

您只需在spider的
start\u url
list属性上设置它们,或者重新实现
start\u requests
spider方法以生成来自任何数据源的请求,然后实现
parse
回调以执行所需的通用内容提取


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

在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)


你好Samresh。首先,你需要找到一个至少能工作1页的方法,然后试着找到一个能工作100万页的有效方法。Scrapy不会给你带来任何神奇的方法,在内容方面比请求和beautifulsoup效果更好。如果您对这些结果感到满意,您可以在scrapy上执行基本相同的操作,这将帮助您并行化请求。如果您对BeautifulSoup的结果不满意,请注意,您的问题根本不容易解决。但是“我看了scrapy,但它似乎在特定网站上爬行”是不正确的,当然您可以传递特定网页的列表:(请参阅start_URL属性)
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]+')