假设有一串html ...
<div class="content">
This is some test <b>this is bold </b> this is great list of text.
</div>
<div class="content">
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>
现在我想使用Scrapy在单个变量中删除这两个元素的内容。
def parse(self, response):
hxs = HtmlXPathSelector(response)
# this returns all nested elements/nodes except text
contents = product.select('//div[@class="content"]/*').extract()
# this returns all nested text except elements/nodes
contents = product.select('//div[@class="content"]/text()').extract()
如何将两个元素/节点的整个嵌套HTML作为变量中的字符串?
答案 0 :(得分:1)
您可以使用/node()
执行此操作 - 请参阅https://stackoverflow.com/a/10899531/85461以回答类似问题。
# Returns all child nodes - text as well as elements.
contents = product.select('//div[@class="content"]/node()').extract()
请注意,extract()
将返回一个列表,您可以通过常规方式连接以恢复HTML:
html = "\n".join(contents)
答案 1 :(得分:0)
如果速度并不重要,您可以使用BeautifulSoup轻松完成 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(response)
contents = soup.findAll("div", {"class":"content"})
for content in contents:
print content # this is div html
答案 2 :(得分:0)
以下xpath
//div[@class="content"]/text()|//div[@class="content"]/b/text()|//div[@class="content"]/ul/li
给出结果,因为您只需要存储两个元素的数据,
contents=product.select('//div[@class="content"]/text()|//div[@class="content"]/b/text()|//div[@class="content"]/ul/li').extract()
现在,内容包含元素的数据