我正在随意使用从一些HTML中提取数据,但我在提取项目列表时遇到了困难。
github项目只描述了一个简单的例子:
from scrapely import Scraper
s = Scraper()
s.train(url, data)
s.scrape(another_url)
例如,如果您试图提取所描述的数据,这是很好的:
使用(API) Scrapely有一个强大的API,包括一个可以外部编辑的模板格式,您可以使用它来构建非常有能力的刮板器。
下面这一节是一个可以在Python中运行的最简单用法的快速示例。
但是,我不知道如何提取数据,如果您发现
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选择器来提取数据,但我更感兴趣的是使用能够为类似页面提取数据的解析器。
发布于 2016-06-06 10:07:28
可以对进行训练,以提取项目列表。诀窍是传递列表的第一项和最后一项,以便在培训时提取为Python列表。这里有一个由问题启发的例子:(培训:来自url1
的10项成分列表,url2
的测试:7项列表)。
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)
在这里,输出:
[{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“页面。一种解决方案是训练几个刮板机,然后检查哪一个在给定的页面上工作。(在几页上培训一个刮板机并不能在快速测试我的时候给出一个通用的解决方案。)
发布于 2016-06-06 10:04:46
Scrapely可以从结构列表(例如<ul>
或<ol>
)中提取项目列表--参见另一个答案。但是,由于它使用HTML/document片段来提取内容,所以它无法提取包含在单个标记中的文本格式的数据,而没有分隔标记(<li></li>
),这似乎就是您在这里试图做的事情。
但是,如果您能够选择作为一个整体的成分块,您可以很容易地后处理您收到的数据,以获得所需的输出。例如,在您的示例中,.split('\n')[3:-2]
将向您提供如下列表中的成分:
['- 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
类进行子类,以添加自定义方法:
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
接受一个后处理器字典,以便在按字段键键返回的数据中运行。例如:
processors = {'ingredients': lambda s: s.split('\n')[3:-2]}
scrape_page_postprocess(page, processors)
https://stackoverflow.com/questions/37555487
复制相似问题