【发布时间】:2014-06-28 00:19:28
【问题描述】:
我正在使用 Scrapy 抓取具有一些奇怪格式约定的网站。基本思想是我想要某个div的所有文本和子元素,除了中间的几个div。这是下面的代码:-
<div align="center" class="article"><!--wanted-->
<img src="http://i.imgur.com/12345.jpg" width="500" alt="abcde" title="abcde"><br><br>
<div style="text-align:justify"><!--wanted-->
Sample Text<br><br>Demo: <a href="http://www.example.com/?http://example.com/item/asash/asdas-asfasf-afaf.html" target="_blank">http://example.com/dfa/asfa/aasfa</a><br><br>
<div class="quote"><!--wanted-->
http://www.coolfiles.ro/download/kleo13.rar/1098750<br>http://www.ainecreator.com/files/0MKOGM6D/kleo13.rar_links<br>
</div>
<br>
<div align="left"><!--not wanted-->
<div id="ratig-layer-2249"><!--not wanted-->
<div class="rating"><!--not wanted-->
<ul class="unit-rating">
<li class="current-rating" style="width:80%;">80</li>
<li><a href="#" title="Bad" class="r1-unit" onclick="doRate('1', '2249'); return false;">1</a></li>
<li><a href="#" title="Poor" class="r2-unit" onclick="doRate('2', '2249'); return false;">2</a></li>
<li><a href="#" title="Fair" class="r3-unit" onclick="doRate('3', '2249'); return false;">3</a></li>
<li><a href="#" title="Good" class="r4-unit" onclick="doRate('4', '2249'); return false;">4</a></li>
<li><a href="#" title="Excellent" class="r5-unit" onclick="doRate('5', '2249'); return false;">5</a></li>
</ul>
</div>
(votes: <span id="vote-num-id-2249">3</span>)
</div>
</div>
<div class="reln"><!--not wanted-->
<strong>
<h4>Related News:</h4>
</strong>
<li><a href="http://www.example.com/themes/tf/a-b-c-d.html">1</a></li>
<li><a href="http://www.example.com/plugins/codecanyon/a-b-c-d">2</a></li>
<li><a href="http://www.example.com/themes/tf/a-b-c-d.html">3</a></li>
<li><a href="http://www.example.com/plugins/codecanyon/a-b-c-d.html">4</a></li>
<li><a href="http://www.example.com/plugins/codecanyon/a-b-c-d.html">5</a></li>
</div>
</div>
</div>
最终输出应如下所示:-
<div align="center" class="article"><!--wanted-->
<img src="http://i.imgur.com/12345.jpg" width="500" alt="abcde" title="abcde"><br><br>
<div style="text-align:justify"><!--wanted-->
Sample Text<br><br>Demo: <a href="http://www.example.com/?http://example.com/item/asash/asdas-asfasf-afaf.html" target="_blank">http://example.com/dfa/asfa/aasfa</a><br><br>
<div class="quote"><!--wanted-->
http://www.coolfiles.ro/download/kleo13.rar/1098750<br>http://www.ainecreator.com/files/0MKOGM6D/kleo13.rar_links<br>
</div>
<br>
</div>
</div>
这是我的 Scrapy 代码。请建议添加到此脚本:-
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from isbullshit.items import IsBullshitItem
class IsBullshitSpider(CrawlSpider):
""" General configuration of the Crawl Spider """
name = 'isbullshitwp'
start_urls = ['http://example.com/themes'] # urls from which the spider will start crawling
rules = [Rule(SgmlLinkExtractor(allow=[r'page/\d+']), follow=True),
# r'page/\d+' : regular expression for http://example.com/page/X URLs
Rule(SgmlLinkExtractor(allow=[r'\w+']), callback='parse_blogpost')]
# r'\d{4}/\d{2}/\w+' : regular expression for http://example.com/YYYY/MM/title URLs
def parse_blogpost(self, response):
hxs = HtmlXPathSelector(response)
item = IsBullshitItem()
item['title'] = hxs.select('//span[@class="storytitle"]/text()').extract()[0]
item['article_html'] = hxs.select("//div[@class='article']").extract()[0]
return item
以下是我尝试过但没有得到预期结果的以下 xpath:-
item['article_html'] = hxs.select("//div[@class='article']").extract()[0]
item['article_html'] = hxs.select("//div[@class='article']/following::node() [not(preceding::div[@class='reln']) and not(@class='reln')]").extract()[0]
item['article_html'] = hxs.select("//div[@class='article']/div[@class='reln']/preceding-sibling::node()[preceding-sibling::div[@class='quote']]").extract()[0]
item['article_html'] = hxs.select("//div[@class='article']/following::node() [not(preceding::div[@class='reln'])]").extract()[0]
item['article_html'] = hxs.select("//div[@class='article']/div[@class='quote']/*[not(self::div[@class='reln'])]").extract()[0]
item['article_html'] = hxs.select("//div[@class='article']/*[(self::name()='reln'])]").extract()[0]
提前谢谢...
【问题讨论】:
-
XPath 不能那样工作。要么使用 XSLT 模板,要么只在
div.article > div中选择您需要的路径,将它们连接起来并用div.article > div包裹整个字符串。 -
我认为您连接和包装整个字符串很有用。如果您可以根据您的想法为我提供我上面的 Scrapy 代码的编辑,那就太好了。因为我是 Scrapy 的新手,所以我不能按照你说的去做。谢谢。
-
有一个solution 但不知道如何在我的场景中实现它。
-
你试过了吗?您遇到的错误是什么? SO 不是为了减轻您的工作负担,我们想帮助您解决有趣的问题。看来您的问题实际上已在链接中得到解答。我建议您尝试自己实现它,如果您不成功,请发布您的尝试。
-
我添加了一些我已经尝试过但无法获得所需结果的 Xpath。并不是我不想学习,我无法理解我评论中提到的解决方案,因为它没有正确缩进。谢谢你的意见。 @artjom-b