使用Scrapy,当我尝试抓取两个几乎相同的页面时,CSS选择器只适用于其中一个页面,而不适用于另一个页面

agxfikkp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(130)

选择器是:
第一个月
页面为thisthat
第一个返回正确的 span,但是第二个不返回任何东西。
我能看到的唯一相关差异是第二页有一个 spanvarpb 类出现在代码的不同部分,但它与我想要的另一个相同。在第二页源代码的第581行:

...
<a class="--link" href="/putear"><span class="varpt">putear</span><span class="varpb">putear</span></a><span class="mx-2" style="color:#888888;">]</span></item> ou
...

字符串
即使它没有得到“正确的”* 跨度 *,它不应该得到这一个吗?我错过了什么?
为了澄清这一点:我不关心使它工作(通过其他方式;改变选择器),我想了解为什么它不,请。
如果任何一个说葡萄牙语的人想知道我为什么要刮这些单词,那是为了玩拼字游戏。

编辑:

感谢 Alexandria 的回答和this other question,我意识到scrappy并没有抓取我期望的HTML代码,而是一个“不完整”的版本。我不能确认这一点,因为我没有亲眼看到这一点(由于对代码的理解不足;抱歉),但显然这是由于页面进行的Ajax调用。

rqqzpn5f

rqqzpn5f1#

对于第一页--> this。你得到的结果<span class="varpb">putear</span>,我相信这是你期望从你的问题中的例子得到的。这是唯一的结果,因为它是唯一的span le
对于第二页--> that,你什么也得不到,因为没有类为varpbspan元素是类为dp-conteudo__esquerdadiv元素的后代。这两个类的元素都存在,但它们不存在于元素树的那个分支中。

编辑

看来问题是你没有看到你所指的页面的实际源html。
一种确保你看到的是scrappy解析的html内容的方法是保存response.text到本地的html文件中,并亲自检查它,这样可以确保你看到的html和scrappy看到的一样。
或者,如果你想在浏览器中查看scrapy看到的html,你可以在scrapy shell中使用view(response)

view(response)

字符串
下面是一个如何使用scrapy shell的例子:

In [2]: fetch('https://dicionario.priberam.org/putear')
2023-12-28 00:22:01 [scrapy.core.engine] INFO: Spider opened
2023-12-28 00:22:01 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://dicionario.priberam.org/putear> (referer: None)

In [3]: with open('putear.html', 'wt', encoding='utf8') as fd:
   ...:     fd.write(response.text)
   ...:

In [4]: fetch('https://dicionario.priberam.org/puteares')
2023-12-28 00:23:09 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://dicionario.priberam.org/puteares> (referer: None)

In [5]: with open('puteares.html', 'wt', encoding='utf8') as fd:
   ...:     fd.write(response.text)
   ...:

相关问题