首先,我对此非常陌生,所以请准备好从我复制/粘贴来自各种来源的代码。
我希望能够删除scrapy返回的任何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>
我没有选择使用/ 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是我最后一次尝试删除它的方式,我并不完全确定我是否正确实现了它但它没有工作。
提前感谢您提供的任何帮助,如果我错过了一些简单的快速搜索可能会让我感到抱歉,我也会道歉。
答案 0 :(得分:17)
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更轻量级。
答案 1 :(得分:0)
最简单的方法是使用 BeautifulSoup 。甚至Scrapy文档都推荐它。
想象一下,你有一个名为“html_text”的变量,里面有这个html代码:
<td> <span class="caps">TEXT</span> </td>
<td> Text </td>
<td> Text </td>
<td> Text </td>
<td> Text </td>
然后你可以用它来删除所有的htmltags:
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 ,您可以在these instructions之后安装。如果你拥有它,你可以复制该代码,看看它对其他HTML做了什么,并修改它以满足你的需求。