论坛风格切换切换到宽版
  • 62阅读
  • 10回复

xpath抓取的值有空格换行符等问题 [复制链接]

上一主题 下一主题
离线北斗星
 

只看楼主 倒序阅读 使用道具 楼主   发表于: 2019-03-28

解决办法: normalize-space()

例子:
原来的xpath为:
user=selector.xpath('//*[@id="Con"]/tr[1]/th/text()')
修改后:
user=selector.xpath(' normalize-space(//*[@id="Con"]/tr[1]/th/text())')
#注意位置
---------------------
作者:我的就是你的就是我的
来源:CSDN
原文:https://blog.csdn.net/u012836179/article/details/69950766
版权声明:本文为博主原创文章,转载请附上博文链接!
离线北斗星

只看该作者 沙发   发表于: 2019-03-28
intro_li = div.xpath('normalize-space(.//div[@class="bookinfo"]/p/text())').extract_first()

print(intro_li)
离线北斗星

只看该作者 板凳   发表于: 2019-03-28
job = select.xpath("td[@class='zwmc']/div/a").xpath('string(.)').extract()[0]
            company = select.xpath("td[@class='gsmc']/a/text()").extract()[0]
            salary = select.xpath("td[@class='zwyx']/text()").extract()[0]
离线北斗星

只看该作者 地板   发表于: 2019-03-28
离线北斗星

只看该作者 4楼  发表于: 2019-03-28
https://blog.csdn.net/lishk314/article/details/83539622


def parse(self, response):
        sel = Selector(response)
        item = StorageItem()
        
        mainXpath = sel.xpath('//div[@class="map_intro clear"]')
        elseXpath = sel.xpath('//div[@class="map_article"]')
        
        item['crawlUrl'] = response.url
        item['enterpriseName'] = mainXpath.xpath('dl/dd[1]/text()').extract() #公司名称
        item['contactUser'] = mainXpath.xpath('dl/dd[2]/text()').extract() #联系人
        item['contactNumber'] = mainXpath.xpath('dl/dd[3]/b/text()').extract() #联系电话
        item['warehouseType'] = mainXpath.xpath('dl/dd[4]/text()').extract()#仓库类型
        item['releaseTime'] = mainXpath.xpath('dl/dt/span/text()').extract()#发布时间
        
        item['warehouseAddress'] = elseXpath.xpath('div/span/text()').extract() #所在地区
        item['warehouseDetailAddr'] = elseXpath.xpath('div/text()[2]').extract() #所在详细地址
        
        sonPath = elseXpath.xpath('table/tbody/tr/td[contains(text(),"仓库规模")]/following-sibling::td[position()=1]')
        if not len(sonPath): #空数组
            sonPath = elseXpath.xpath('table/tbody/tr/td[contains(text(),"仓库建设方案")]/../following-sibling::tr/td[position()=2]')
        
        item['warehouseSize'] = sonPath.xpath('normalize-space(translate(translate(string(.),"\xa0",""),"平米",""))').extract()
        
        if len(item['enterpriseName']):
            yield item
        
        alinkList = sel.xpath('//dd[@class="intro"]/a/@href').extract()
        for alink in alinkList:
            yield Request(url=alink, callback=self.parse)
---------------------
作者:木子_lishk
来源:CSDN
原文:https://blog.csdn.net/lishk314/article/details/83539622
版权声明:本文为博主原创文章,转载请附上博文链接!
离线北斗星

只看该作者 5楼  发表于: 2019-03-28
#每爬完一个网页会回调parse方法
def parse(self, response):
hx=response.xpath('//td[@class="zwmc"]/div/a[contains(@href, "450836980250071")]')
#选取href里有"450836..."
print('_________________________')
print(hx[0].select("@href").extract()) # 取长度
print(hx[0].select("text()").extract()) # 取长度
离线北斗星

只看该作者 6楼  发表于: 2019-03-28
import scrapy

class QuoteSpider(scrapy.Spider):
    name = 'quote'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.xpath('span/small/text()').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)
离线北斗星

只看该作者 7楼  发表于: 2019-03-28
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class TutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass


class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()


class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()
    #link = scrapy.Field()
离线北斗星

只看该作者 8楼  发表于: 2019-03-28
a[contains(@title, '下页')]/@href


contains(str1, str2) # str1中有str2,则返回true,例如以下表达式输出链接文字中包含image的链接:

hxs.select('//a[contains(@href, "image")]/@href').extract()
离线北斗星

只看该作者 9楼  发表于: 2019-03-28
Scrapy使用XPath的表达式的机制来获得html或xml中的内容。这里只记录下html的使用。

你可以用scrapy shell来测试selector的用法,官网提供了一个简单的测试页面给你使用:
http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

在shell中抓取一个页面:
scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

用shell抓回来的页面,默认的对象是hxs。

获取title标签
hxs.select("//title")
select函数返回的是一个XPathSelectorList

获取title标签中的文本
hxs.select("//title/text()")

只显示文本,而不是一个XPathSelectorList
hxs.select("//title/text()").extract()

获取标签中的属性,例如获取href属性中的内容
hxs.select('//base/@href').extract()

使用contains函数查找指定内容,格式为:
contains(str1, str2) # str1中有str2,则返回true,例如以下表达式输出链接文字中包含image的链接:
hxs.select('//a[contains(@href, "image")]/@href').extract()

如果你想获取div标签中的所有p标签的内容,你不能这样写:
divs=hxs.select("//div")
for p in divs.select("//p")  # 获取所有的p标签中的内容,而不是仅是div中的内容
    print p.extract()

正确的写法:
divs=hxs.select("//div")
for p in divs.select(".//p")  
    print p.extract()
或者
divs=hxs.select("//div")
for p in divs.select("p")  
    print p.extract()

HtmlXPathSelector 需要一个html_response作为参数:
x = HtmlXPathSelector(html_response)
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个