gpt4 book ai didi

web-scraping - Scrapy:检查标签中是否有另一个标签并抓取两个元素

转载 作者:行者123 更新时间:2023-12-04 14:20:51 26 4
gpt4 key购买 nike

我正在尝试抓取使用此结构的 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()

但如果 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 选择器,但欢迎您使用 xpath 选择器。

最佳答案

您可以使用 xpath 中的 descendant-or-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()))

关于web-scraping - Scrapy:检查标签中是否有另一个标签并抓取两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55061531/

26 4 0