web-scraping - Scrapy:检查标签内是否有另一个标签并刮掉这两个元素
问题描述
我正在尝试抓取使用此结构的 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
但如果a
元素内有p
元素,则仅返回元素前后的文本
虽然此查询返回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 选择器。
解决方案
您可以使用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()))
推荐阅读
- python - 将新属性分配给函数时,如何抑制 mypy 中的“没有属性”错误?
- scheduled-tasks - 将雪花任务结果复制到阶段并下载到 csv
- javascript - 使用 Gotenberg 和 Google Cloud 将 .docx 转换为 .pdf
- typescript - 对象属性的通用选择器函数
- python-3.x - 当仅通过 Google Cloud Function 部署一个功能时,如何调试“构建失败:并发构建过多”错误?
- flutter - 如何在 ListView.builder 的最后一项下方添加一些空白?以便我可以正确点击最后一个复选框?
- mysql - 在 MYSQL SERVER 中添加 auto_incremente PK
- amazon-web-services - 使用 aws s3 cp(本地)将数据从我的 S3 存储桶移动到我的 EC2 实例是否会产生数据传输费用?
- azure-devops - Web.config 变量更新不适用于 Azure DevOps 管道(文件转换)
- python - 即使定义了所有值,Pandas dataframe.loc 也会返回空数据框