【问题标题】:Beautiful Soup wont extract specific HTMLBeautiful Soup 不会提取特定的 HTML
【发布时间】: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&nbsp;|&nbsp;</div>
    <div class="date">23/08/15</div>
    <div class="datetime">13:51&nbsp;|&nbsp;</div>
    <div class="grade">A7&nbsp;|&nbsp;</div>
    <div class="distance">470m&nbsp;|&nbsp;</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


【解决方案1】:

请看这个答案:UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

然后尝试改变

track = [ i.getText().strip() for i in ten]

到

track = [ i.getText().encode('utf-8').strip() for i in ten]

我相信你的问题是你有一个 str 无法处理的 unicode 字符

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2013-05-20
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多