我该如何使用XPath

时间:2017-05-19 22:27:21

标签: python xpath scrapy

使用Xpath,如何在'description'中提取'p'的文本?

<item>
            <link>http://spor.haber7.com/futbol/haber/2335589-ispanya-avrupa-sampiyonu</link>
            <guid>2335589</guid>
            <pubDate>Sat, 20 May 2017 00:24:00 +0300</pubDate>
            <category><![CDATA[Futbol]]></category>
            <title><![CDATA[Ä°spanya Avrupa Åampiyonu]]></title>
            <description><![CDATA[<a href="http://spor.haber7.com/futbol/haber/2335589-ispanya-avrupa-sampiyonu" target="_blank"><img src="http://image.cdn.haber7.com//haber/haber7/thumbs/2017/20/ispanya_avrupa_sampiyonu_1495229064_1854.jpg" /></a><p>İspanya, normal süresi 2-2 berabere sona eren final maçında İngiltere'ye penaltı atışları sonucu 4-1 üstünlük kurarak kupanın sahibi oldu.</p>]]></description>
        </item>

这些是我写的代码行。按照@romanperekhrest的建议,我按照以下方式安排了我的代码行。但它仍然无效。

from scrapy.spiders import CrawlSpider
import xml.etree.ElementTree as ET, re


class aliSpider(CrawlSpider):
    name = "aksam_spider"
    start_urls = ['http://www.aksam.com.tr/cache/rss.xml']

    def parse(self, response):
        SET_SELECTOR = '/rss/channel/item'

        baslik_SELECTOR = './/title/text()'
        icerik_SELECTOR = './/description/text()'
        link_SELECTOR='.//link/text()'
        tarih_SELECTOR='.//pubDate/text()'


        for brickset in response.xpath(SET_SELECTOR):
            tree = ET.parse(brickset.xpath(icerik_SELECTOR).extract_first())
            root = tree.getroot()
            desc = re.search(r'<p>([^<>]+)</p>', root.find("description").text).group(1)

            yield {
                'baslik': brickset.xpath(baslik_SELECTOR).extract_first(),
                'icerik': desc,
                'link':   brickset.xpath(link_SELECTOR).extract_first(),
                'tarih':brickset.xpath(tarih_SELECTOR).extract_first()
            } 

1 个答案:

答案 0 :(得分:1)

XPath (&gt; = 1.0.4)解决方案:

substring-before(substring-after(/item/description, "<p>"), "</p>")

XPath结果:

İspanya, normal süresi 2-2 berabere sona eren final maçında İngiltere'ye penaltı atışları sonucu 4-1 üstünlük kurarak kupanın sahibi oldu.

使用过的功能:

https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/substring-after https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/substring-before

带有xml.etree.ElementTree模块的

Python 3.x解决方案:

import xml.etree.ElementTree as ET, re

tree = ET.parse("test.xml")
root = tree.getroot()
desc = re.search(r'<p>([^<>]+)</p>',root.find("description").text).group(1)
print(desc)

输出:

İspanya, normal süresi 2-2 berabere sona eren final maçında İngiltere'ye penaltı atışları sonucu 4-1 üstünlük kurarak kupanın sahibi oldu.