我一直致力于Scrapy,试图真正理解它,但是我似乎仍然有一些概念上的障碍。我现在正在抓取一个页面,在那里我想从一个div的子div中提取所有文本,同时排除其中一个子div。在我看来,我可以使用response.css("parent-div ::text").getall()
从父div中提取文本,然后删除将在子div中找到的文本(* 虽然我觉得这很难理解,尽管我有代码可以实现 *)或者我可以尝试使用:not selector伪类。但是,我很难理解如何正确地使用它们。
我在这里抓取的HTML的基本结构是这样的(实际页面是:(第10页)
<div class = "entry-content">
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled">
</div>
现在,我已经设法制作了一个代码片段,它设法只返回我不想要的内容。
response.css("div.entry-content div:not([id='jp-post-flair']) ::text").getall()
以下是我目前的解决方法
chapt_text = response.css("div.entry-content ::text").getall()
text_exclude = response.css("div.entry-content div:not([id='jp-post-flair']) ::text").getall()
chapt_text = [elem for elem in chapt_text if elem not in text_exclude] # removing some of the text we don't want
我上面的变通方法 * 是为了得到我的最终结果 *,但我希望能够用途:not,这样它就更紧凑了(尽管我认为这不会那么明确,因为它有自己的缺点)。
大多数情况下,我寻找的是更多关于如何最好地使用的信息:不正确。我没有找到太多真正描述如何使用它的资源。
预期输出(预加载项和管道)(明显示例)
['文本','更多文本','等']
编辑日期:2012年9月22日
在阅读了答案之后,我意识到我不需要用途:not来获得我想要的东西。我犯了一个错误,使用::text来提取父容器(div. entry-content)的所有子文本,而不是意识到我可以提取p标记response.css("div.entry-content > p ::text").getall()
的所有子文本。因此,虽然我得到了一个更简洁的工作结果,但我最终没有使用:not伪类。
1条答案
按热度按时间bjg7j2ky1#
我不是css选择器的Maven,也不是使用
:not
qsuedo状态的Maven,但是如果你的目标是简洁,还有很多其他的选择可以实现。例如,您可以使用一个XPath表达式来获得您要查找的结果。
输出功率