试图从这样的东西中抓取一些HTML。有时我需要的数据在div中,有时在div1中,等等。
想象一下,每个人都上了3-5节课。其中之一就是生物学。他们的成绩单总是按字母顺序排列的。我要每个人的生物成绩。
我已经把所有这些HTML都拼凑成了一个文本,现在该如何提取生物学成绩呢?
<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中,等等。
发布于 2013-11-30 06:04:59
(1)仅仅获得生物学成绩,它几乎是一条直线。
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输出如下所示:
[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
import bs4, re
soup = bs4.BeautifulSoup(html)
scores = soup.find_all(text=re.compile('Biology'))
divs = [score.parent for score in scores]
print divs输出如下所示:
[<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的更多信息。祝你工作顺利。
发布于 2020-07-17 06:31:20
另一种方法(使用css选择器)是:
divs = soup.select('div:contains("Biology")')
编辑:
BeautifulSoup4 4.7.0+ (SoupSieve) 是必需的
发布于 2013-11-30 06:03:08
您可以通过搜索任何以score作为class属性值的<div>元素来提取它们,并使用正则表达式来提取其生物学分数:
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))像这样运行它:
python3 script.py htmlfile这就产生了:
A+
B
B
B
Bhttps://stackoverflow.com/questions/20293792
复制相似问题