【发布时间】:2015-08-26 10:17:32
【问题描述】:
我正在使用带有 Pycharm 和 Notebook++ 的 Windows 7 使用下面的 Python 代码,我设法从以下 HTML 中提取所需的数据
<div class="resultsBlock">
<ul class="header">
<li class="first essential fin">Fin</li>
<li class="essential greyhound">Greyhound</li>
<li class="trap">Trap</li>
<li class="sp">SP</li>
<li class="timeSec">Time/Sec.</li>
<li class="timeDistance">Time/Distance</li>
</ul>
代码提取完成位置、名称trap、sp、timeSec和timeDistance,并将信息放入csv文件。源代码中这段代码的正上方是以下 HTML
<div class="resultsBlockHeader clearfix mediumRoundedCorners">
<div class="track">Belle Vue | </div>
<div class="date">23/08/15</div>
<div class="datetime">13:51 | </div>
<div class="grade">A7 | </div>
<div class="distance">470m | </div>
<div class="prizes">1st £56, Others £20 (BGRF added £30)</div>
我用我的 Python 代码有效地替换了这个:
one = bsObj.findAll("li", {"class": "first essential fin"})
有了这个
track = bsObj.findAll("div", {"class": "track"})
但是,当我执行此操作时,Python 会忽略它,甚至没有向我提供任何消息告诉我它为什么忽略此代码。 下面是完整的代码,一开始我刚刚放置了一行代码,试图提取 div 类行。任何建议表示赞赏。
import csv
from urllib import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.gbgb.org.uk/resultsRace.aspx?id=1793467" )
bsObj = BeautifulSoup(html)
track = bsObj.findAll("div", {"class": "track"})#the line that wont work
one = bsObj.findAll("li", {"class": "first essential fin"})
two = bsObj.findAll("li", {"class": "essential greyhound"})
four = bsObj.findAll("li", {"class": "timeDistance"})
five = bsObj.findAll("li", {"class": "trap"})
six = bsObj.findAll("li", {"class": "sp"})
seven = bsObj.findAll("li", {"class": "timeSec"})
eight = bsObj.findAll("li", {"class": "essential trainer"})
nine = bsObj.findAll("li", {"class": "first essential comment"})
ten = bsObj.findAll("div", {"class": "track"})
firstessentialfin = [ a.getText().strip() for a in one ]
essentialgreyhound = [ b.getText().strip() for b in two]
timeDistance = [ c.getText().strip() for c in four]
trap = [ d.getText().strip() for d in five ]
sp = [ e.getText().strip() for e in six ]
timeSec = [ f.getText().strip() for f in seven]
essentialtrainer = [ g.getText().strip() for g in eight]
firstessentialcomment = [ h.getText().strip() for in nine]
track = [ i.getText().strip() for i in ten]
with open('lugs.csv', 'wb') as csvfile:
writer = csv.writer(csvfile, delimiter=",")
for f in zip(firstessentialfin, essentialgreyhound, trap, timeSec, timeDistance,sp,track):
writer.writerow(f)
【问题讨论】:
-
这可能是因为你有嵌套的 div 吗?因此,您可以在“track”类的第一个 div 级别中找到,但没有...
-
当你说它不起作用时,你是什么意思?您从未对
track变量中的任何内容执行getText()。最后 4 行的缩进也不正确,但这可能只是复制粘贴错误,而不是您的代码问题。 -
“不会的,伙计们!我做的一切都是正确的,但这个图书馆不会按照我说的去做!”不太可能。 BeautifulSoup 是一个经过良好测试的流行库。你显然做错了什么。请至少在minimum, complete, and verifiable form 中发布您的输入示例、预期输出以及您尝试过的内容。
-
您好,谢谢您的回答。Richard,不太清楚您所说的嵌套 div 是什么意思,我以为 BF 只会找到指向它的任何内容。dstudeba,我现在已经包含了所有代码,包括获取 text() 并将其添加到底部的 zip 中,我收到以下消息...第 37 行,在
writer.writerow(f) UnicodeEncodeError: 'ascii' codec can't encode character u'\ xa0' in position 9: ordinal not in range(128)...我已经对此进行了搜索,它似乎与 html 中的文本样式有关,但整个代码中的 HTML 是相同的。 -
嗨两位炼金术士..如果您排除 ...track = bsObj.findAll("div", {"class": "track"})....以及所有相关的代码。这是令人困惑的一点,因为我看不出是什么阻止了 BS 解决这个问题,因为我将相同的原则应用于相同的问题......好吧,我想我还是这样 :) :) :)
标签: python html beautifulsoup