【问题标题】:Some HTML elements are missing when crawling using Scrapy使用 Scrapy 抓取时缺少一些 HTML 元素
【发布时间】:2021-07-17 20:58:07
【问题描述】:

我正在尝试从网站的 HTML 元素中抓取一些文本。大部分都很好,但由于某些原因,Scrapy 没有得到浏览器检查中显示的所有 HTML 元素。当我尝试禁用 JavaScript 但仍然在我的浏览器中显示那些缺失的元素时,内容是静态的。 该网站的结构类似于:

<ul class="paragraph-title">...</ul>
<ul class="paragraph-title">
    <p>TEXT 1</p>
    <p class="list-item">TEXT 2</p>
    <p class="list-item">TEXT 3</p>
</ul>
<ul class="paragraph-title">
    <p>TEXT 4</p>
    <ol class="level-one"></ol>
    <ol class="level-two">
        <li class="level-two-item">TEXT 5</li>
        <li class="level-two-item">TEXT 6</li>
    </ol>
</ul>
<ul class="paragraph-title">...</ul>

这是我的 Scrapy Spider:

import scrapy
class MySpider(scrapy.Spider):
    name = "MySpider"
    start_urls = ['https://www.example.com']
def parse(self, response):
    entries = response.css('ul.paragraph-title')
    for entry in entries:
        yield {
            'text': entry.css('::text').getall()
        }

当我在scrapy shell 中尝试entries[2].getall() 时,我注意到scrapy 在第三个ul 中找不到ol 和li 标签:

['<ul class="paragraph-title"><p>TEXT 4</p></ul>']

如何从 li 标签中获取“TEXT 5”和“TEXT 6”?

【问题讨论】:

  • 呵呵,你在这里发现了一个奇怪的,用任何其他标签替换ol,你的代码就可以工作了……很奇怪
  • @tomjn 那么这可能是scrapy的错误吗?

标签: python html scrapy web-crawler


【解决方案1】:

您可以直接使用lxml.html(例如使用lxml.html.tostring(lxml.html.parse('foo.html')))来检查它是如何解析这个HTML代码的。在这种情况下是

<ul class="paragraph-title">
    <p>TEXT 4</p>
    </ul><ol class="level-one"></ol>
    <ol class="level-two">
        <li class="level-two-item">TEXT 5</li>
        <li class="level-two-item">TEXT 6</li>
    </ol>

所以它不支持在ul 中嵌套ol。我不知道这是一个错误还是一个深思熟虑的决定。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多