Scrapy не может найти внутри <div>теги - PullRequest
0 голосов
/ 19 сентября 2019

добрый день.В настоящее время я пишу программу Scrapy, чтобы переписать новостной сайт.Я новичок в Scrapy, и я столкнулся с трудностями, которые не позволили мне прогрессировать в моем коде.

Веб-сайт, который я сейчас пытаюсь удалить, - https://www.thestar.com.my/news/nation

Внутри html-тегов страницы есть тег div с class = "list-list-row" .Я пытаюсь получить тег абзац внутри тега div , но Скрапи почему-то не может найти этот тег.

Я проверил все закрытые теги, но все они, похоже, закрыты.Так почему же Scrapy не смог получить этот тег?Самым внутренним тегом, который может извлечь Scrapy, является div class = "sub-section-list" , который находится вне div class = "row list-list"

Кроме того, когда я получаю тег div class = "sub-section-list" , он извлекает только эти HTML-теги:

"<div class=""sub-section-list"">
     <div class=""button-view btnLoadMore"" style=""margin: 10px auto 15px;"">
         <a id=""loadMorestories"">Load more </a>
     </div>
 </div>"

При проверке веб-сайта мне нужны следующие теги

Тег веб-сайта

Я включумой основной код.Я только начал проект, поэтому я не добился никакого прогресса после этой проблемы.

import scrapy


class WebCrawl(scrapy.Spider):
    name = "spooder"
    allowed_domains = ["thestar.com.my"]
    start_urls = ["https://www.thestar.com.my/news/nation"]

    def parse(self, response):
        text = response.xpath("//div[@class='sub-section-list']").extract()
        yield {
            'text' : text
        }

Если я забыл добавить какие-либо другие необходимые вещи, пожалуйста, сообщите.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Как говорит Вим, страница загружается динамически, поэтому есть несколько вариантов .Используя инструменты разработчика Firefox, создается впечатление, что содержимое извлекается из:

https://cdn.thestar.com.my/Content/Data/parsely_data.json

Таким образом, вы можете напрямую загрузить json и получить то, что вы хотите оттуда.Что-то вроде:

import scrapy
import json

class WebCrawl(scrapy.Spider):
    name = "spooder"
    allowed_domains = ["thestar.com.my"]
    start_urls = ["https://cdn.thestar.com.my/Content/Data/parsely_data.json"]

    def parse(self, response):
        yield from json.loads(response.text)['data']

Конечно, это, вероятно, не совсем то, что вы хотите, но, возможно, это хорошее начало?

(Обратите внимание, что приведенный выше код является излишнимдля того, что он делает, но если вы собираетесь начать скрести, вы можете работать с этим)

0 голосов
/ 19 сентября 2019

Контент загружается динамически, поэтому вы не сможете использовать xpath, как этот, без визуализации страницы.Кажется, что статьи присутствуют в html, и вы можете получить его следующим образом:

import json
script = response.xpath(
  "//script[contains(text(), 'var listing = ')]/text()"
).extract_first()

first_index = script.index('var listing = ') + len('var listing = ')
last_index = script.index('};') + 1
listings = json.loads(script[first_index:last_index])
articles = [article['article_body'] for article in listings['data']] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...