【问题标题】:Leveraging Beautifulsoup within Scrapy在 Scrapy 中利用 Beautifulsoup
【发布时间】:2018-01-03 22:54:56
【问题描述】:

我用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)

我当前的目标是从起始 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 对象和来自 ScrapyResponse 背后的逻辑。

感谢任何输入。

【问题讨论】:

  • scrapy doc: Selectors - 你不需要 BeautifulSoup。

标签: python parsing beautifulsoup scrapy


【解决方案1】:

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

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

请注意,虽然这可行并且您可以使用 soup 来 HTML 解析所需的数据,但您并没有使用 Scrapy 的大部分 - Scrapy selectors,在 Item Loaders 中使用选择器等。如果我如果是你,我只会让自己对 Scrapy 从 HTML 中提取数据的能力感到满意。

【讨论】:

  • 当我通过 response.body 创建一个 BeautifulSoup 对象时,我收到一个错误“NameError: name 'response' is not defined。”我假设响应是一系列 url,可以通过任何命令调用以从列表中提取数据。我是 Python 新手,我正在根据基于 R 逻辑的假设工作,这显然是有缺陷的。
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多