Scrapy отображает текст xpath с помощью lxml

Как я могу заставить свою страницу parse_page отображать текст и числовое значение для названия моего элемента? Я могу отображать только href.

    def parse_page(self, response):
    self.log("\n\n\n Page for one device \n\n\n")
    self.log('Hi, this is the parse_page page! %s' % response.url)
    root = lxml.etree.fromstring(response.body)
    for row in root.xpath('//row'):
        allcells = row.xpath('./cell')
        #... populate Items
    for cells in allcells:
        item = CiqdisItem()
        item['title'] = cells.get(".//text()")
        item['link'] = cells.get("href")
        yield item

мой xml-файл

<row>
<cell type="html">
<input type="checkbox" name="AF2C4452827CF0935B71FAD58652112D" value="AF2C4452827CF0935B71FAD58652112D" onclick="if(typeof(selectPkg)=='function')selectPkg(this);">
</cell>
<cell type="plain" style="width: 50px; white-space: nowrap;" visible="false">http://qvpweb01.ciq.labs.att.com:8080/dis/metriclog.jsp?PKG_GID=AF2C4452827CF0935B71FAD58652112D&amp;view=list</cell>
<cell type="plain">6505550000</cell>
<cell type="plain">probe0</cell>
<cell type="href" style="width: 50px; white-space: nowrap;" href="metriclog.jsp?PKG_GID=AF2C4452827CF0935B71FAD58652112D&view=list">
UPTR
<input id="savePage_AF2C4452827CF0935B71FAD58652112D" type="hidden" value="AF2C4452827CF0935B71FAD58652112D">
</cell>
<cell type="href" href="/dis/packages.jsp?show=perdevice&device_gid=3651746C4173775343535452414567746D75643855673D3D53564A6151624D41716D534C68395A6337634E2F62413D3D&hwdid=probe0&mdn=6505550000&subscrbid=6505550000&triggerfilter=&maxlength=100&view=timeline&date=20100716T050314876" style="white-space: nowrap;">2010-07-16 05:03:14.876</cell>
<cell type="plain" style="width: 50px; white-space: nowrap;"></cell>
<cell type="plain" style="white-space: nowrap;"></cell>
<cell type="plain" style="white-space: nowrap;">2012-10-22 22:40:15.504</cell>
<cell type="plain" style="width: 70px; white-space: nowrap;">1 - SMS_PullRequest_CS</cell>
<cell type="href" style="width: 50px; white-space: nowrap;" href="/dis/profile_download?profileId=4294967295">4294967295</cell>
<cell type="plain" style="width: 50px; white-space: nowrap;">250</cell>
</row>

Вот мое последнее редактирование ниже, я показываю оба метода. Проблема в том, что первый метод не анализирует все ссылки в столбце A по порядку, он не в порядке, и если столбец A равен нулю, он захватывает следующую ссылку из столбца B. Как я могу отображать только столбец A и если столбец A равно null, пропустите его и перейдите в тот же столбец A?

Метод 2 parse_page. Не повторяет все строки. Это неполный разбор. Как получить все строки?

    def parse_device_list(self, response):
    self.log("\n\n\n List of devices \n\n\n")
    self.log('Hi, this is the parse_device_list page! %s' % response.url)
    root = lxml.etree.fromstring(response.body)
    for row in root.xpath('//row'):
        allcells = row.xpath('.//cell')
        # first cell contain the link to follow
        detail_page_link = allcells[0].get("href")
        yield Request(urlparse.urljoin(response.url, detail_page_link ), callback=self.parse_page)

    def parse_page(self, response):
    self.log("\n\n\n Page for one device \n\n\n")
    self.log('Hi, this is the parse_page page! %s' % response.url)
    xxs = XmlXPathSelector(response)
    for row in xxs.select('//row'):
       for cell in row.select('.//cell'):
           item = CiqdisItem()
           item['title'] = cell.select("text()").extract()
           item['link'] = cell.select("@href").extract()
           yield item

person Gio    schedule 24.07.2013    source источник


Ответы (1)


Просто замените .//text() на text() и href на @href.

Кроме того, почему lxml? В Scrapy встроены селекторы xpath, попробуйте:

def parse_page(self, response):
    hxs = HtmlXPathSelector(response)
    for row in hxs.select('//row'):
        for cell in row.select('.//cell'):
           item = CiqdisItem()
           item['title'] = cell.get("text()")
           item['link'] = cell.get("@href")
           yield item
person alecxe    schedule 24.07.2013
comment
Спасибо @alecxe - мне просто нужно было перейти с hxs на xxs = XmlXPathSelector (ответ). Также я разместил еще один вопрос ссылка на мой второй вопрос о преобразовании lxml в скрап-построенный xxs . Для этого я сначала попытался сделать это в xxs, но потерпел неудачу, пока кто-то не сказал мне, что, может быть, попробовал lxml, чтобы заставить его работать, и он действительно работал в lxml. - person Gio; 25.07.2013
comment
Привет @alecxe - после анализа моего веб-сканера я заметил, что он не анализирует все строки для каждой таблицы, а только разделяет пару строк, но не все. Все строки находятся на одной странице. (это не ограничивает количество строк на странице.) Может быть, это поможет, если я отредактирую свой вопрос и вставлю оба своих метода. - person Gio; 26.07.2013