删除不带/text()的HTML标记。extract()

2024-06-26 13:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望能够删除任何垃圾返回的html代码。我把所有东西都存储在MySQL中,没有任何问题,但我现在还不能做的是删除很多“<;td>;”和其他html标记。我最初只是使用/text().extract()运行,但它会随机遇到一个按如下方式格式化的单元格:

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

它没有一个模式可以让我在使用/文本与否之间做出选择,我正在寻找一个初学者能够实现的最简单的方法来消除所有这些。

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是我最后一次尝试那样删除它,我不完全确定我是否正确实现了它,但它没有工作。

提前感谢你的帮助,如果我错过了一些简单的东西,我也很抱歉,快速搜索可以拉上来。


Tags: textfromimportselffieldsloaderitemprocessor
2条回答

Scrapy的作者在他们的w3lib中使用了一系列这种功能,它是Scrapy的一部分/包含在Scrapy中。

根据您的代码,您使用的是非常过时的Scrapy版本(0.22之前)。我不确定你到底能得到什么,所以你可能需要从scrapy.utils.markup导入,而不是从

如果变量my_text包含HTML文本,请执行以下操作:

>>> 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    '

使用w3lib(代码可用here)修复/转换html/markup还有很多额外的功能。

因为这只是一个函数,所以很容易合并到项目加载程序中,并且比使用BS4更轻量级。

最简单的方法是使用美化组。即使是残破的文件也推荐了它。

假设您有一个名为“html_text”的变量,其中包含以下html代码:

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

然后可以使用此命令删除所有htmltag:

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()

请注意,您需要使用美化组4,您可以安装以下these instructions。如果你有,你可以复制粘贴代码,看看它对其他html做了什么,然后修改它来满足你的需要。

相关问题 更多 >