Python Xpath使用Scrapy在下一个同级标记中获取信息

Python Xpath使用Scrapy在下一个同级标记中获取信息,python,html,xpath,scrapy,Python,Html,Xpath,Scrapy,我正试图弄到Scrapy,现在我试图从语源学网站上提取信息: 现在,我只想知道这些词和它们的原始描述。以下是常用HTML代码块在etymonline中的显示方式: 15世纪30年代,“尽职或有礼貌的态度”,摘自(v.)和法语地址。“正式演讲”的意思是从1751年开始的。“字母上标”的意思来自1712年,并由此产生了“居住地”的含义(1888年)。 单词包含在标记中,描述包含在下一个同级标记中。 要在这样的页面上获取单词列表,可以编写word=sel.xpath('//dl/dt/a/text

我正试图弄到Scrapy,现在我试图从语源学网站上提取信息: 现在,我只想知道这些词和它们的原始描述。以下是常用HTML代码块在etymonline中的显示方式:


15世纪30年代,“尽职或有礼貌的态度”,摘自(v.)和法语地址。“正式演讲”的意思是从1751年开始的。“字母上标”的意思来自1712年,并由此产生了“居住地”的含义(1888年)。
单词包含在
标记中,描述包含在下一个同级
标记中。 要在这样的页面上获取单词列表,可以编写
word=sel.xpath('//dl/dt/a/text()').extract()


然后我尝试循环这个单词列表,并使用这行代码提取相关信息
info=selInfo.xpath(“//dl/dt[a='”+word[I]+']/following sibling::dd”)
。但它似乎不起作用。有什么想法吗?

使用xpath的想法不是
循环
提取的列表,而是在xpath中的父节点内

目前我的mac电脑上没有scrapy,但这里的技术应该同样适用,如下所示:

# I use lxml for loose html string parsing
from lxml import html

s = '''<dt><a href="/index.php?term=address&allowed_in_frame=0">address (n.)</a> <a href="http://dictionary.reference.com/search?q=address" class="dictionary" title="Look up address at Dictionary.com"><img src="graphics/dictionary.gif" width="16" height="16" alt="Look up address at Dictionary.com" title="Look up address at Dictionary.com" /></a></dt>
<dd>1530s, "dutiful or courteous approach," from <a href="/index.php?term=address&allowed_in_frame=0" class="crossreference">address</a> (v.) and from French <span class="foreign">adresse</span>. Sense of "formal speech" is from 1751. Sense of "superscription of a letter" is from 1712 and led to the meaning "place of residence" (1888).</dd>'''

sel = html.fromstring(s)

# rather than extracting the words straight away, you loop from the parent xpath
for nodes in sel.xpath('//dt'):
    # then access a node to get the text
    print nodes.xpath('a/text()')
    # and go back to parent and search the dd node
    print nodes.xpath('../dd/text()')

# sample results
['address (n.)']
['1530s, "dutiful or courteous approach," from ', ' (v.) and from French ', '. Sense of "formal speech" is from 1751. Sense of "superscription of a letter" is from 1712 and led to the meaning "place of residence" (1888).']
#我使用lxml进行松散的html字符串解析
从lxml导入html
s='''
15世纪30年代,“尽职或有礼貌的态度”,摘自(v.)和法语地址。“正式演讲”的意思是从1751年开始的。“字母上标”的含义来自1712年,并由此产生了“居住地”(1888)的含义
sel=html.fromstring(s)
#不是直接提取单词,而是从父xpath循环
对于sel.xpath('//dt')中的节点:
#然后访问一个节点以获取文本
print nodes.xpath('a/text()'))
#然后返回父节点并搜索dd节点
print nodes.xpath(“../dd/text()”)
#样本结果
[地址(n.)]
['1530年,“尽职或礼貌的态度”,来自','(v.)和法语','。“正式讲话”的含义来自1751年。“字母的上标”的含义来自1712年,并由此产生了“居住地”的含义(1888年)。]
希望这有帮助。

要在
之后进入
,您可以使用
下面的兄弟姐妹轴,您是正确的

以下同级::dd
,选择上下文节点后的所有
dd
元素。因此,您需要使用位置谓词
[1]
将XPath限制为仅第一个

对于从
//dl/dt
中得到的每个
dt
元素,您可以选择
以下同级::dd[1]

下面是一个使用
scrapy shell
作为术语“地址”的示例会话:

$scrapy shell”http://www.etymonline.com/index.php?allowed_in_frame=0&search=address&searchmode=none"
...
2014-11-26 10:34:53+0100[默认]调试:爬网(200)(参考:无)
[s] 可用的刮擦对象:
[s] 爬虫
[s] 项目{}
[s] 请求
[s] 回应
[s] 背景
[s] 蜘蛛
[s] 有用的快捷方式:
[s] shelp()Shell帮助(打印此帮助)
[s] 获取(请求或url)获取请求(或url)并更新本地对象
[s] 查看(响应)在浏览器中查看响应
[1]中:对于响应中的dt.xpath('//dl/dt'):
打印“Word:”,dt.xpath('string(a)')。提取()
打印“Definition:”,dt.xpath('string(后面的同级::dd[1])).extract()
打印
...:     
单词:[你的地址(n.)]
定义:[15世纪30年代,“尽职或礼貌的态度”,出自地址(v.)和法语地址。“正式讲话”的含义源自1751年。“字母上标”的含义源自1712年,并由此产生“居住地”的含义(1888年)。]
字:[u'收件人(n.)']
定义:[u'1810;见地址(v.)+-ee.]
单词:[你的地址(v.)]
定义:[u'14世纪早期,,“引导或指导”,源于古法语的adricier“直走;伸直,设置正确;指向,直接”(13世纪),源于粗俗拉丁语的addireciare“make right”,源于拉丁语的add“to”(见ad-)+*directiare,源于拉丁语directus“direct”(见direct(v.)。14世纪晚期,源于“按顺序排列,修复,纠正”。意思是“作为书面信息的目的地”来自15世纪中期。意思是“直接说(给某人)”来自15世纪晚期。相关:寻址;寻址。“]
单词:[u'Sallatorian(n.)]
定义:[u'1841,美式英语,来自称呼语“的性质”,这里的具体含义是“指定在大学毕业典礼上发表的欢迎词”(1702)+-ian。该词最初通常用拉丁语,由排名第二的毕业生发表。]
...
单词:[牧师(adj.)]
定义:[公元前15年早期,“值得尊敬”,来自中法语系的牧师,来自拉丁语的“受尊敬的人”,里韦里(见牧师)的格伦迪夫(gerundive)。作为牧师的一种称呼形式,它从公元前15年晚期开始被证明;早期的牧师(从这个意义上说,公元14年晚期)。缩写Rev.从1721年开始被证明,更早的版本。(1690年代)“非常尊敬”是指院长,是指主教的尊敬,是指大主教的最尊敬。”
单词:[u'nun(n.)]
定义:[古英语nunne“nun,vestal,异教徒女祭司,宣誓献身于宗教生活的女性,”源自拉丁语nonna“nun,tutor”,最初(与masc.nonnus一起)是对老年人的称呼,可能来自儿童的讲话,让人联想到nana(比较梵语nona,波斯语nana“母亲”,希腊语nana“姨妈,“塞族克罗地亚人尼娜”的母亲,“意大利人诺娜”的祖母;“见保姆”。]
在[2]中:

使用以下同级的解决方案

class SingleSpider(scrapy.Spider):
    name = "etym"
    allowed_domains = ["etymonline.com"]
    start_urls = [
        "http://www.etymonline.com/index.php?l=d&allowed_in_frame=0"]

    def parse(self, response):


        for nodes in response.xpath('//dl'):
            for i in nodes.xpath('dt'):
                print i.xpath('a/text()').extract()   
                print i.xpath('following-sibling::dd[1]/text()').extract()    
基本上:

  • 一个接一个地得到Dt元素
  • 打印链接中包含的文本
  • 移动到下一个同级并打印包含的文本
  • 列表项
这里是输出的摘录:

【u’daiquiri(n.)】【u’型酒精饮料,1920年(首次记录于 斯科特·菲茨杰拉德),来自联合国
class SingleSpider(scrapy.Spider):
    name = "etym"
    allowed_domains = ["etymonline.com"]
    start_urls = [
        "http://www.etymonline.com/index.php?l=d&allowed_in_frame=0"]

    def parse(self, response):


        for nodes in response.xpath('//dl'):
            for i in nodes.xpath('dt'):
                print i.xpath('a/text()').extract()   
                print i.xpath('following-sibling::dd[1]/text()').extract()