#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 🙂