【问题标题】:How can i extract only text in scrapy selector in python如何在python的scrapy选择器中只提取文本
【发布时间】:2012-11-21 08:51:21
【问题描述】:

我有这个代码

   site = hxs.select("//h1[@class='state']")
   log.msg(str(site[0].extract()),level=log.ERROR)

输出是

 [scrapy] ERROR: <h1 class="state"><strong>
            1</strong>
            <span> job containing <strong>php</strong> in <strong>region</strong> paying  <strong>$30-40k per year</strong></span>
                </h1>

是否可以只获取没有任何html标签的文本

【问题讨论】:

    标签: python scrapy


    【解决方案1】:
    //h1[@class='state']
    

    在您上面的 xpath 中,您正在选择具有 class 属性 stateh1 标签

    这就是为什么它选择 h1 element 中的所有内容

    如果你只想选择h1标签的文本,你所要做的就是

    //h1[@class='state']/text()
    

    如果你想选择h1标签的文本以及它的子标签,你必须使用

    //h1[@class='state']//text()
    

    所以区别在于/text() 用于特定标签文本,//text() 用于特定标签及其子标签的文本

    下面提到的代码适合你

    site = ''.join(hxs.select("//h1[@class='state']/text()").extract()).strip()
    

    【讨论】:

    • 很好的解释/text()//text()的区别
    • xpath 永远不应被低估
    【解决方案2】:

    您可以使用 BeautifulSoup get_text() 功能。

    from bs4 import BeautifulSoup
    
    text = '''
    <td><a href="http://www.fakewebsite.com">Please can you strip me?</a>
    <br/><a href="http://www.fakewebsite.com">I am waiting....</a>
    </td>
    '''
    soup = BeautifulSoup(text)
    
    print(soup.get_text())
    

    【讨论】:

      【解决方案3】:

      我没有运行一个scrapy实例,所以我无法测试它;但您可以尝试在搜索表达式中使用text()

      例如:

      site = hxs.select("//h1[@class='state']/text()")
      

      (从tutorial得到它)

      【讨论】:

        【解决方案4】:

        您可以使用BeautifulSoup 去除html标签,这里是一个例子:

        from BeautifulSoup import BeautifulSoup
        ''.join(BeautifulSoup(str(site[0].extract())).findAll(text=True))
        

        然后您可以去除所有额外的空格、新行等。

        如果你不想使用额外的模块,你可以尝试简单的正则表达式:

        # replace html tags with ' '
        text = re.sub(r'<[^>]*?>', ' ', str(site[0].extract()))
        

        【讨论】:

          【解决方案5】:

          您可以使用html2text

          import html2text
          converter = html2text.HTML2Text()
          print converter.handle("<div>Please!!!<span>remove me</span></div>")
          

          【讨论】:

            猜你喜欢
            • 2019-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-30
            • 2020-11-15
            • 2021-10-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多