我正在关注scrapy文档教程,我希望从以下站点获取示例数据: http://www.docteur.ch/generalistes/generalistes_k_ag.html
在scrapy中运行view命令后,我得到了以下我试图抓取的表的html代码。该页面包含每个条目的表格:
<table class="novip">
<tr class="novip">
<td class="novip-portrait-picture"
rowspan="5">
<a class="novip-portrait-picture"
href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html">
<img class="novip-portrait-picture"
src="/customer_controlled/pictures/65903/portrait/65903.png"
alt="Pas d'image encore"
onError="portrait_m_image_failover(this)" />
</a>
</td>
<td class="novip-left">
<a class="novip-firmen-name"
href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html"
target="_top">
Baumberger Hans Rudolf
</a>
</td>
<td class="novip-right"
width="25%">
<a class="novip"
href="/medecin/baumberger-hans-rudolf-aarau-5000-medecin.html"
target="_top">
rating info: <img class="novip-inforating"
src="/img/general/stars/stars3 "
alt="rating info"
width="70" height="14" align="bottom" border="0" />
</a>
</td>
</tr>
<tr class="novip">
<td class="novip-left">
Dr. med. Facharzt FMH für Allgemeine Innere Medizin
</td>
</tr>
<tr class="novip">
<td class="novip-left">
Bahnhofstrasse 92, 5000 Aarau
</td>
<td class="novip-right-telefon">
tél: 062 822 46 28
</td>
</tr>
<tr class="novip">
<td class="novip-left-email">
e-mail:
<a class="novip-left-send-message-button-inactive"
href="/eintrag/fr_keine_mitteilung_moeglich.html">
Envoyer un message
</a>
<a class="novip-left-make_appointment-button-inactive"
href="/eintrag/fr_kein_termin_moeglich.html">
prendre un rendez-vous
</a>
</td>
<td class="novip-right-fax">
fax: 062 822 35 20
</td>
</tr>
</table>
对于我的蜘蛛,我使用教程中的基础知识和自定义xpath:
def parse(self, response):
for sel in response.xpath('//tr[@class="novip"]'):
item = DocteurItem()
item['name'] = sel.xpath('//a[@class="novip-firmen-name"]/text()[normalize-space()]').extract()
yield item
我在json中获得的输出为表中的每个名称生成一个名称Field,但用所有表中的所有名称填充它,如下所示:
[{"name": ["Name1, Name2, ..... NameN"]
[{"name": ["Name1, Name2, ..... NameN"]
等等。我如何更改代码/ xpath,以便只用一个名称填充名称字段,然后移动到下一个表?
答案 0 :(得分:2)
通过在开头添加一个点来为name
特定于上下文的创建表达式:
for sel in response.xpath('//tr[@class="novip"]'):
item = DocteurItem()
item['name'] = sel.xpath('.//a[@class="novip-firmen-name"]/text()[normalize-space()]').extract_first()
yield item
请注意,我使用extract_first()
代替extract()
。