删除没有/text().extract()的HTML标签



首先,我对这一切都很陌生,所以准备好从各种来源复制/粘贴一些代码。

我希望能够删除任何html代码,scrapy返回。我已经把所有的东西都存储在MySQL中,没有问题,但我还不能开始工作的是删除了很多'

'和其他HTML标签。我最初只是运行/text().extract(),但它会随机遇到这样格式化的单元格:
<td>    <span class="caps">TEXT</span>  </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>

没有一个模式,我可以选择使用/text或不,我正在寻找一个初学者可以实现的最简单的方法,将剥离所有的。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import Join, MapCompose
import html2text
from scraper.items import LivingSocialDeal

class CFBDVRB(BaseSpider):
    name = "cfbdvrb"
    allowed_domains = ["url"]
    start_urls = [
        "url",
    ]
    deals_list_xpath = '//table[@class="tbl data-table"]/tbody/tr'
    item_fields = {
        'title': './/td[1]',
        'link': './/td[2]',
        'location': './/td[3]',
        'original_price': './/td[4]',
        'price': './/td[5]',
    }
    def parse(self, response):
        selector = HtmlXPathSelector(response)
        for deal in selector.xpath(self.deals_list_xpath):
            loader = XPathItemLoader(LivingSocialDeal(), selector=deal)
            # define processors
            loader.default_input_processor = MapCompose(unicode.strip)
            loader.default_output_processor = Join()
            # iterate over fields and add xpaths to the loader
            for field, xpath in self.item_fields.iteritems():
                loader.add_xpath(field, xpath)
            converter = html2text.HTML2Text()
            converter.ignore_links = True
            yield loader.load_item()

converter = html2text是我最后一次尝试以这种方式删除它,我不完全确定我正确地实现了它,但它不起作用。

提前感谢您想给予的任何帮助,如果我错过了一些简单的东西,我也很抱歉,一个快速搜索可以拉起来。

Scrapy的作者在他们的w3lib中使用了很多这样的功能,这是Scrapy的一部分。

根据你的代码,你正在使用一个相当过时的Scrapy版本(0.22之前)。我不确定你有什么可用的,所以你可能需要从scrapy.utils.markup导入

如果你有一个包含HTML文本的变量my_text,执行以下操作:

>>> from w3lib.html import remove_tags
>>> my_text
'<td>    <span class="caps">TEXT</span>  </td>n<td>    Text    </td>n<td>    Text    </td>n<td>    Text    </td>n<td>    Text    </td>'
>>> remove_tags(my_text)
u'    TEXT  n    Text    n    Text    n    Text    n    Text    '

有很多额外的功能来修复/转换html/标记与w3lib(代码可在这里)。

因为这只是一个函数,所以它将非常容易合并到您的项目加载器中,并且将比使用BS4更轻量级。

最简单的方法是使用BeautifulSoup。即使是Scrapy文档也推荐它。

假设你有一个名为"html_text"的变量,里面有以下html代码:

<td>    <span class="caps">TEXT</span>  </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>

然后你可以用这个来删除所有的html标签:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_text, 'html.parser')
just_text = soup.get_text()

那么变量"just_text"将只包含文本:

TEXT
Text
Text
Text

我希望这能解决你的问题。

你可以看到更多的例子和安装指南(比Scrapy更容易):BeautifulSoup

祝你好运!

编辑:

这里你有一个工作的例子与你提出的html:

from bs4 import BeautifulSoup

html_text = """
<td>    <span class="caps">TEXT</span>  </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>
<td>    Text    </td>
"""
soup = BeautifulSoup(html_text, 'html.parser')
List_of_tds = soup.findAll('td')
for td_element in List_of_tds:
    print td_element.get_text()

请注意,您需要使用BeautifulSoup 4,您可以按照以下说明安装它。如果你有它,你可以复制粘贴代码,看看它对其他html的作用,并修改它以满足你的需要。

最新更新