【问题标题】:Scrapy1.1/Python3 Removing string from stringScrapy 1.1/Python 从字符串中删除字符串
【发布时间】:2016-08-18 17:06:42
【问题描述】:

我正在尝试从旧的 html 页面获取数据。

Python3 Debian Scrapy 1.1

我在这里看到了几个我正在尝试做的例子,但由于我不明白的原因,我无法重现我的结果:

我想要获取的信息是此处的联系人姓名 (John Doe)

<p><strong>Contact: <a href="http://www.example.com/t/search-title-Proprietor.html" style="color:#259cd5">Proprietor</a> John Doe</strong></p>

我可以用 Scrapy 返回:

Contact: [u'Contact: ', u' John Doe']

唯一的问题是 "Contact:" 部分写在我的 CSV 文件中...

Contact: , John Doe

我尝试了一堆正则表达式并使用变量,但我总是遇到另一个问题。

这是我用来获取数据的:

item['Contact'] = response.xpath('//*[@id="main-contain"]/div[2]/div/div[6]/p[10]/strong/text()').extract()

我也尝试了 .replace() 但我最终得到了

[u'', u' John Doe']

【问题讨论】:

    标签: python-3.x web-scraping scrapy


    【解决方案1】:

    终于这么简单了,

    我的变量包含一个列表。我需要 .replace() 在列表中的某些内容上。

    contact[1].replace("联系人:", "")

    修复一切

    【讨论】:

      【解决方案2】:

      根据网站用来表示联系人的模式,您有几个选项:

      In [1]: import scrapy
      
      In [2]: selector = scrapy.Selector(text='<p><strong>Contact: <a href="http://www.example.com/t/search-title-Proprietor.html" style="color:#259cd5">Proprietor</a> John Doe</strong></p>')
         ...:     
      

      在您的示例中,strong 元素有 3 个子元素:1 个文本节点、一个链接和另一个文本节点:

      In [3]: selector.xpath('.//p/strong/node()').extract()
      Out[3]: 
      ['Contact: ',
       '<a href="http://www.example.com/t/search-title-Proprietor.html" style="color:#259cd5">Proprietor</a>',
       ' John Doe']
      

      您对作为文本节点的直接子节点使用过滤器的 XPath:

      In [4]: selector.xpath('.//p/strong/text()').extract()
      Out[4]: ['Contact: ', ' John Doe']
      

      您可以使用[last()] 谓词选择最后一个:

      In [5]: selector.xpath('.//p/strong/text()[last()]').extract()
      Out[5]: [' John Doe']
      

      Scrapy 选择器有一个 .extract_first() 方法来获取单个值(或无),而不是使用 .extract() 获得的默认列表:

      In [6]: selector.xpath('.//p/strong/text()[last()]').extract_first()
      Out[6]: ' John Doe'
      

      此外,您可以使用 XPath 的 normalize-space() 去掉前导空格:

      In [7]: selector.xpath('normalize-space(.//p/strong/text()[last()])').extract_first()
      Out[7]: 'John Doe'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多