在Scrapy中利用Beautifulsoup

时间:2018-01-03 22:54:57

标签: python parsing beautifulsoup scrapy

我创建了一个带有Scrapy的简单抓取工具,该抓取工具从给定的链接开始,并跟随给定DEPTH_LIMIT中的所有链接,每次运行蜘蛛时都会调整这些链接,因为项目参数。为简单起见,脚本打印响应URL。

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from NONPROF.items import NonprofItem
from scrapy.http import Request
import re

class Nonprof(CrawlSpider):
    name = "my_scraper"
    allowed_domains = ["stackoverflow.com"]
    start_urls = ["https://stackoverflow.com"]

    rules = [
        Rule(LinkExtractor(
            allow=['.*']),
             callback='parse_item',
             follow=True)
        ]

    def parse_item (self, response):
        print (response.url)

我目前的目标是从起始网址解析给定深度内的所有可见文本,并将该数据用于主题建模。我在过去使用BeautifulSoup做了类似的事情,但我想在我的抓取工具中使用以下解析语言。

from bs4 import BeautifulSoup
import bs4 as bs
import urllib.request

def tag_visible(element):
    if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
        return False
    elif isinstance(element,bs.element.Comment):
        return False
    return True


def text_from_html(body):
    soup = BeautifulSoup(html, 'lxml')
    texts = soup.findAll(text=True)
    visible_texts = filter(tag_visible, texts)  
    return u" ".join(t.strip() for t in visible_texts)

html = urllib.request.urlopen('https://stackoverflow.com').read()
print(text_from_html(html))

我在整合两者方面遇到的困难是BeautifulSoup对象和Response Scrapy背后的逻辑。

赞赏任何意见。

1 个答案:

答案 0 :(得分:3)

至少,您只需将response.body中包含的HTML源直接传递给BeautifulSoup即可解析:

soup = BeautifulSoup(response.body, "lxml") 

但是请注意,虽然这可行,但您可以使用soup来解析所需的数据,但您没有使用Scrapy的大部分内容 - Scrapy selectors,{{3}中使用选择器如果我是你,我只是让自己熟悉Scrapy从HTML中提取数据的方式。