首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用零碎的方式提取项目列表?

如何使用零碎的方式提取项目列表?
EN

Stack Overflow用户
提问于 2016-05-31 20:58:27
回答 2查看 1.4K关注 0票数 4

我正在随意使用从一些HTML中提取数据,但我在提取项目列表时遇到了困难。

github项目只描述了一个简单的例子:

代码语言:javascript
运行
复制
from scrapely import Scraper
s = Scraper()

s.train(url, data)
s.scrape(another_url)

例如,如果您试图提取所描述的数据,这是很好的:

使用(API) Scrapely有一个强大的API,包括一个可以外部编辑的模板格式,您可以使用它来构建非常有能力的刮板器。

下面这一节是一个可以在Python中运行的最简单用法的快速示例。

但是,我不知道如何提取数据,如果您发现

代码语言:javascript
运行
复制
Ingredientes

- 50 gr de hojas de albahaca
- 4 cucharadas (60 ml) de piñones
- 2 - 4 dientes de ajo
- 120 ml (1/2 vaso) de aceite de oliva virgen extra
- 115 gr de queso parmesano recién rallado
- 25 gr de queso pecorino recién rallado ( o queso de leche de oveja curado)

我知道我不能使用xpath或css选择器来提取数据,但我更感兴趣的是使用能够为类似页面提取数据的解析器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-06 10:07:28

可以对进行训练,以提取项目列表。诀窍是传递列表的第一项和最后一项,以便在培训时提取为Python列表。这里有一个由问题启发的例子:(培训:来自url1的10项成分列表,url2的测试:7项列表)。

代码语言:javascript
运行
复制
from scrapely import Scraper

s = Scraper()

url1 = 'http://www.sabormediterraneo.com/recetas/postres/leche_frita.htm'
data = {'ingreds': ['medio litro de leche',   # first and last items
  u'canela y az\xfacar para espolvorear']}
s.train(url1, data)

url2 = 'http://www.sabormediterraneo.com/recetas/cordero_horno.htm'
print s.scrape(url2)

在这里,输出:

代码语言:javascript
运行
复制
[{u'ingreds': [
  u' 2 piernas o dos paletillas de cordero lechal o recental ',
  u'3 dientes de ajo',
  u'una copita de vino tinto / o / blanco',
  u'una copita de agua',
  u'media copita de aceite de oliva',
  u'or\xe9gano, perejil',
  u'sal, pimienta negra y aceite de oliva']}]

关于问题的成分列表(http://www.sabormediterraneo.com/cocina/salsas6.htm)的培训并没有直接推广到"recetas“页面。一种解决方案是训练几个刮板机,然后检查哪一个在给定的页面上工作。(在几页上培训一个刮板机并不能在快速测试我的时候给出一个通用的解决方案。)

票数 6
EN

Stack Overflow用户

发布于 2016-06-06 10:04:46

Scrapely可以从结构列表(例如<ul><ol>)中提取项目列表--参见另一个答案。但是,由于它使用HTML/document片段来提取内容,所以它无法提取包含在单个标记中的文本格式的数据,而没有分隔标记(<li></li>),这似乎就是您在这里试图做的事情。

但是,如果您能够选择作为一个整体的成分块,您可以很容易地后处理您收到的数据,以获得所需的输出。例如,在您的示例中,.split('\n')[3:-2]将向您提供如下列表中的成分:

代码语言:javascript
运行
复制
['- 50 gr de hojas de albahaca',
 '- 4 cucharadas (60 ml) de piñones',
 '- 2 - 4 dientes de ajo',
 '- 120 ml (1/2 vaso) de aceite de oliva virgen extra',
 '- 115 gr de queso parmesano recién rallado',
 '- 25 gr de queso pecorino recién rallado ( o queso de leche de oveja curado)']

如果您希望定期这样做(或者需要向多个字段添加后处理),您可以按以下方式对Scraper类进行子类,以添加自定义方法:

代码语言:javascript
运行
复制
class PostprocessScraper(Scraper):

    def scrape_page_postprocess(self, page, processors=None):
        if processors == None:
            processors = {}

        result = self.scrape_page(page)
        for r in result:
            for field, items in r.items():
                if field in processors:
                    fn = processors[field]
                    r[field] = [fn(i) for i in items]

        return result

这个新方法scrape_page_postprocess接受一个后处理器字典,以便在按字段键键返回的数据中运行。例如:

代码语言:javascript
运行
复制
processors = {'ingredients': lambda s: s.split('\n')[3:-2]}
scrape_page_postprocess(page, processors)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37555487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档