Не удается выполнить итерацию через XPathSelectorList

#python #xpath #scrapy #firebug

#python #xpath #scrapy #firebug

Вопрос:

Я создал простой веб-скребок ниже:

 from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class ITTester(BaseSpider):
    name = 'ITTester'
    allowed_domains = ["sec.gov"]
    start_urls = ['http://www.sec.gov/Archives/edgar/data/320193/000112760212034445/xslF345X03/form4.xml']

    def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select("/html/body/table[3]/tbody/tr")
    print len(sites)
    for site in sites:
        HHH = site.select("/td[1]/span[1]/text()").extract()
        print HHH
 

Я захожу на этот сайт и хочу очистить и распечатать каждый экземпляр «Common Stock» (то есть в 2 раза «Common Stock»).

Я идентифицировал строки таблицы с hxs.select("/html/body/table[3]/tbody/tr") помощью, и при печати возвращаемой длины XPathSelectorList она выводит 2, однако печать в for loop возвращает 2 пустые скобки [] . Я использовал Firebug для получения XPath, я проверил, что tbody он действительно есть в исходном коде.

Есть идеи, что я делаю неправильно?

Ответ №1:

Используйте относительный путь во внутреннем выборе so site.select("td[1]/span[1]/text()").extract() вместо того, что у вас есть.

Комментарии:

1. Спасибо! Это сработало как шарм. Можете ли вы уточнить, в чем разница между наличием / before и нет?

2. Любой путь, начинающийся с / выбора, идет вниз от узла документа, поэтому /td[1] выбирается первый td дочерний элемент узла документа. Вам нужен первый td дочерний элемент вашего site узла, поэтому вам нужно использовать относительный путь.

3. Спасибо! Хотелось бы, чтобы я лучше понимал Xpath 🙂