Scrapy: проверка наличия тега внутри и удаление обоих элементов - PullRequest
2 голосов
/ 08 марта 2019

Я пытаюсь очистить 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 имеют элементы, а некоторые - нет. Что я сделал до сих пор, так это:

economics["article_content"] = response.css("div.article-body div#firstBodyDiv > p:nth-child(n+1)::text").extract()

но возвращает только текст до и после элемента a, если внутри элемента p

есть элемент 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, вы можете использовать селекторы xpath.

1 Ответ

1 голос
/ 08 марта 2019

Вы можете использовать функциональность descendant-or-self из xpath, которая будет получать все внутренние тексты.

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())) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...