Web scraping Scrapy:检查标记内部是否有另一个标记,并刮除两个元素

Web scraping Scrapy:检查标记内部是否有另一个标记,并刮除两个元素,web-scraping,scrapy,Web Scraping,Scrapy,我正在尝试刮取使用此结构的html页面: <div class="article-body"> <div id="firstBodyDiv"> <p class="ng-scope"> This is a dummy text for explanation purposes </p> <p> class="ng-scope"> T

我正在尝试刮取使用此结构的html页面:

<div class="article-body">
    <div id="firstBodyDiv">
        <p class="ng-scope">
            This is a dummy text for explanation purposes
        </p>
        <p> class="ng-scope">
          This is a <a>dummy</a> text for explanation purposes
        </p>
    </div>
</div>
但是如果
p
元素中有
a
元素,则它只返回
a
元素前后的文本

当此查询返回
a(s)
元素时:

response.css("div.article-body div#firstBodyDiv p:nth-child(n+1) a::text").extract()
我想找到一种方法来检查是否存在
a
元素,以便执行另一个查询(在
a
元素中刮取文本的查询)

这就是我迄今为止所做的:

for i in response.css("div.article-body div#firstBodyDiv p:nth-child(n+1)"):
    if response.css("div.article-body div#firstBodyDiv p:nth-child(n+1) a") in i : 
        # ofcourse this isnt working since and i am getting this error 
        # 'in <string>' requires string as left operand, not SelectorList
        # probably i will have a different list1, list1.append() the p 
        # before, a, and the p text after the a element
        # assign that list to economics["article_content"]
css(“div.article-body div#firstBodyDiv p:nth child(n+1)”): 如果response.css(“div.article-body div#firstBodyDiv p:nth child(n+1)a”)在i: #当然,这是不工作,因为我得到这个错误 #“in”要求字符串作为左操作数,而不是选择器列表 #可能我会有一个不同的list1,list1.append()p #在a元素之前、a和a元素之后的p文本 #将该列表分配给经济学[“文章内容”]
尽管我使用的是css选择器,但欢迎您使用xpath选择器。

您可以使用xpath中的
后代或self
功能,这将获取所有内部文本

for i in response.css('div.article-body div#firstBodyDiv > p:nth-child(n+1)'):
 print(''.join(i.xpath('descendant-or-self::text()').extract())) 
您还可以使用
scrapy shell
使用原始HTML测试代码,如下所示:

$ scrapy shell
from scrapy.http import HtmlResponse
response = HtmlResponse(url='test', body='''<div class="article-body"> 
   <div id="firstBodyDiv"> 
       <p class="ng-scope"> 
           This is a dummy text for explanation purposes 
       </p> 
       <p class="ng-scope"> 
         This is a <a>dummy</a> text for explanation purposes 
       </p> 
   </div> 
</div> 
''', encoding='utf-8')
for i in response.css('div.article-body div#firstBodyDiv > p:nth-child(n+1)'):
     print(''.join(i.xpath('descendant-or-self::text()').extract())) 
$scrapy shell
从scrapy.http导入HtmlResponse
response=HtmlResponse(url='test',body=''

这是一个用于解释目的的虚拟文本

这是一个用于解释目的的虚拟文本

'',编码='utf-8') 对于i in response.css('div.article-body div#firstBodyDiv>p:nth child(n+1)'): print(“”.join(i.xpath('sundant-or-self::text()).extract())
哇,我以前不知道这件事,你刚刚救了我的命,谢谢
$ scrapy shell
from scrapy.http import HtmlResponse
response = HtmlResponse(url='test', body='''<div class="article-body"> 
   <div id="firstBodyDiv"> 
       <p class="ng-scope"> 
           This is a dummy text for explanation purposes 
       </p> 
       <p class="ng-scope"> 
         This is a <a>dummy</a> text for explanation purposes 
       </p> 
   </div> 
</div> 
''', encoding='utf-8')
for i in response.css('div.article-body div#firstBodyDiv > p:nth-child(n+1)'):
     print(''.join(i.xpath('descendant-or-self::text()').extract()))