首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Beautiful Soup按文本内容选择div?

如何使用Beautiful Soup按文本内容选择div?
EN

Stack Overflow用户
提问于 2013-11-30 05:47:34
回答 3查看 14.6K关注 0票数 15

试图从这样的东西中抓取一些HTML。有时我需要的数据在div中,有时在div1中,等等。

想象一下,每个人都上了3-5节课。其中之一就是生物学。他们的成绩单总是按字母顺序排列的。我要每个人的生物成绩。

我已经把所有这些HTML都拼凑成了一个文本,现在该如何提取生物学成绩呢?

代码语言:javascript
复制
<div class = "student">
    <div class = "score">Algebra C-</div>
    <div class = "score">Biology A+</div>
    <div class = "score">Chemistry B</div>
</div>
<div class = "student">
    <div class = "score">Biology B</div>
    <div class = "score">Chemistry A</div>
</div>
<div class = "student">
    <div class = "score">Alchemy D</div>
    <div class = "score">Algebra A</div>
    <div class = "score">Biology B</div>
</div>
<div class = "student">
    <div class = "score">Algebra A</div>
    <div class = "score">Biology B</div>
    <div class = "score">Chemistry C+</div>
</div>
<div class = "student">
    <div class = "score">Alchemy D</div>
    <div class = "score">Algebra A</div>
    <div class = "score">Bangladeshi History C</div>
    <div class = "score">Biology B</div>
</div>

我正在使用漂亮的汤,我想我必须找到文本中包含“生物学”的div?

这只是一个快速刮擦,我对硬编码和摆弄Excel之类的东西持开放态度。是的,这是一个劣质的网站!是的,他们确实有API,而我对WDSL一无所知。

简写版本:http://www.legis.ga.gov/Legislation/en-US/Search.aspx,用于查找每个账单上的最后操作日期。这很麻烦,因为如果一项法案在第二个议院中没有发起人,而不是一个什么都不包含的div,他们就根本就没有一个div。因此,时间线有时在div 3中,有时在2中,等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-30 06:04:59

(1)仅仅获得生物学成绩,它几乎是一条直线。

代码语言:javascript
复制
import bs4, re
soup = bs4.BeautifulSoup(html)
scores_string = soup.find_all(text=re.compile('Biology')) 
scores = [score_string.split()[-1] for score_string in scores_string]
print scores_string
print scores

输出如下所示:

代码语言:javascript
复制
[u'Biology A+', u'Biology B', u'Biology B', u'Biology B', u'Biology B']
[u'A+', u'B', u'B', u'B', u'B']

(2)定位标记,如果要执行进一步的任务,则需要找到parent

代码语言:javascript
复制
import bs4, re
soup = bs4.BeautifulSoup(html)
scores = soup.find_all(text=re.compile('Biology'))
divs = [score.parent for score in scores]
print divs

输出如下所示:

代码语言:javascript
复制
[<div class="score">Biology A+</div>, 
<div class="score">Biology B</div>, 
<div class="score">Biology B</div>, 
<div class="score">Biology B</div>, 
<div class="score">Biology B</div>]

*总之,您可以使用find_siblings/parent/...等在HTML树中移动。*

有关如何navigate the tree的更多信息。祝你工作顺利。

票数 24
EN

Stack Overflow用户

发布于 2020-07-17 06:31:20

另一种方法(使用css选择器)是:

divs = soup.select('div:contains("Biology")')

编辑:

BeautifulSoup4 4.7.0+ (SoupSieve) 是必需的

票数 6
EN

Stack Overflow用户

发布于 2013-11-30 06:03:08

您可以通过搜索任何以score作为class属性值的<div>元素来提取它们,并使用正则表达式来提取其生物学分数:

代码语言:javascript
复制
from bs4 import BeautifulSoup 
import sys
import re

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'html')

for div in soup.find_all('div', attrs={'class': 'score'}):
    t = re.search(r'Biology\s+(\S+)', div.string)
    if t: print(t.group(1))

像这样运行它:

代码语言:javascript
复制
python3 script.py htmlfile

这就产生了:

代码语言:javascript
复制
A+
B
B
B
B
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20293792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档