【问题标题】:How do you scrape specific paragraph text using find or select in Python?如何在 Python 中使用 find 或 select 来抓取特定的段落文本?
【发布时间】:2021-03-25 00:12:18
【问题描述】:

我正在尝试抓取具有由 h3 标题设置的段落内容的网站。 H3 标题有标题内容(例如品牌、型号、年份),然后段落中的以下文本就是我所追求的。理想情况下,我很想使用一个类来识别段落内容,但它们都是同一个类。

另外,我应该说,我是新手,所以请原谅愚蠢的问题或口齿不清的措辞。

我已经到了可以拉出文本的地步,但由 html 段落标签分隔。我的想法是,(1)如果我能以某种方式将段落标签之间的内容转换为列表中的单个项目,我可以针对该列表编写一个循环以将这些项目修改到我正在构建的数据库中。

或者,(2)我想知道是否有某种方法可以从包含特定文本(例如福特“模型”)的标题后面的段落中提取同级段落文本。我知道你可以使用定义的 id 和类来做到这一点,但是你能根据它包含的文本识别特定的 h3 标签吗?

在过去的几天里,我一直在不停地看 youtube 和阅读论坛。任何反馈,如您所愿直言不讳,将不胜感激!我正在使用 beautifulsoup,但我很乐意做最适合这项工作的任何事情。

谢谢!

约翰

这里是 html -

<div class="entry-content bb">                                      
<h4>Pedigree</h4>
<p>This is where the content is for pedigree that I am trying to scrape</p>
<h4>Breed</h4>
<p>This is where the content is for breed that I am trying to scrape</p>
<h4>Origin</h4>
<p>This is where the content is for origin that I am trying to scrape</p>

如果我可以单独识别下面的类,那么我将使用的代码 -

pedigree_temp = soup.find(class_='pedigree').text
pedigree_final.append(pedigree_temp)

【问题讨论】:

  • 请使用 HTML 编辑您的问题。并向我们​​展示您迄今为止的尝试。以及预期的输出
  • 如果您包含您要抓取的网站会有所帮助...
  • 包括网站。另外,是全部 h4 还是只有某些需要考虑?
  • 我只寻找特定的段落。以我提供的 html 为例,假设我正在寻找“谱系”和“起源”下的段落文本,而不是“品种”。阿尔伯特看起来接近我正在寻找的解决方案(通过使用我还不熟悉的正则表达式)但它似乎并不存在,因为在找到正确的 h4 元素后它似乎没有拉出同级文本。我需要找到正确的 H4 文本,然后拉出前面的段落文本,将其保存为临时变量,然后将该数据附加到我的数据表中。

标签: python html python-3.x web-scraping beautifulsoup


【解决方案1】:

在 bs4 4.7.1+ 中,您可以使用 :contains 定位 h4 标记的内容,然后使用相邻的兄弟组合符 (+) 移动到相邻的 p。您可以使用以下语法从要搜索的标题项列表中生成适当的选择器:

from bs4 import BeautifulSoup as bs

html = '''<div class="entry-content bb">                                      
<h4>Pedigree</h4>
<p>This is where the content is for pedigree that I am trying to scrape</p>
<h4>Breed</h4>
<p>This is where the content is for breed that I am trying to scrape</p>
<h4>Origin</h4>
<p>This is where the content is for origin that I am trying to scrape</p>'''

soup = bs(html, 'lxml')
headers = ['Pedigree', 'Breed']
selector = ', '.join([f'h4:contains("{header}") + p' for header in headers])
print([i.text for i in soup.select(selector)])

【讨论】:

【解决方案2】:

如果您想要汤中所有段落标签中的文本列表,请尝试:

[tag.text for tag in soup.select('p')]

或者获取包含特定文本的标签列表:

import re
for elem in soup(text=re.compile('find me!')):
    print elem.parent

【讨论】:

  • 谢谢你,阿尔伯特!由于您提交了答案,因此我提供了更多关于 html 的上下文。很抱歉没有早点把它包括在内。我需要研究正则表达式,因为它似乎是解决问题不可或缺的一部分。从我目前所能收集到的信息来看,我似乎需要将“next_sibling”拉到我能够识别的 H4 标题中。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 2021-12-30
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
相关资源
最近更新 更多