【问题标题】:Using Beautiful Soup, grabbing stuff between <li> and </li>使用 Beautiful Soup,在 <li> 和 </li> 之间抓取东西
【发布时间】:2013-04-08 05:17:00
【问题描述】:

这是我目前的代码:

import urllib
from bs4 import BeautifulSoup

lis = []
webpage = urllib.urlopen('http://facts.randomhistory.com/interesting-facts-about-     cats.html')
soup = BeautifulSoup(webpage)
for ul in soup:
    for li in soup.findAll('li'):
        lis.append(li)
    for li in lis:
        print li.text.encode("utf-8")

我只是想从开始和结束“li”标签之间获取猫的事实,并以一种看起来不会乱七八糟的方式输出它们。目前,此代码的输出将所有事实重复 4 次左右,“can't”一词出现为“can’t”。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 为什么要遍历 ul 元素然后不使用它们?摆脱那条for 行。

标签: python html tags web-scraping beautifulsoup


【解决方案1】:

它的Content-Type 说它的编码是ISO-8859-1,但它在撒谎。使用from_encoding 告诉 Beautiful Soup 忽略它的谎言。您可以通过为 parse_only 指定一个 SoupStrainer 来减少 Beautiful Soup 的工作量,它只选择具有 content-td 类的东西。最后,您可以简化 for 循环。一起来:

import urllib2
import bs4

webpage = urllib2.urlopen('http://facts.randomhistory.com/interesting-facts-about-cats.html')
soup = bs4.BeautifulSoup(webpage, from_encoding='UTF-8',
                         parse_only=bs4.SoupStrainer(attrs='content-td'))
for li in soup('li'):
    print li.text.encode('utf-8')

您可以通过用单个空格替换连续的空格并删除上标来进一步改进输出。

【讨论】:

  • 这对我有用,但我仍然得到 ’ 而不是撇号。
  • @user2256199:我不知道该说什么; from_encoding 为我解决了所有问题。
【解决方案2】:

您不需要外部循环 (for ul in soup)。如果您删除它,它将输出一次。

soup = BeautifulSoup(webpage)
for li in soup.findAll('li'):
    lis.append(li)
for li in lis:
    print li.text.encode("utf-8")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 2017-08-14
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多