【问题标题】:Accessing uninform <dt></dt> <dd></dd> tags访问非通知 <dt></dt> <dd></dd> 标签
【发布时间】:2015-04-22 23:50:00
【问题描述】:
from collections import defaultdict
import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd

r= requests.get("http://www.walmart.com/search/?query=marvel&cat_id=4096_530598")
r.content
soup = BeautifulSoup(r.content)

g_data = soup.find_all("div", {"class" : "tile-content"})

data=defaultdict(list)


for tile in g_data:
#the "tile" value in g_data contains what you are looking for...
#find the product titles
    try:
        title = tile.find("a","js-product-title")
        data['Product Title'].append(title.text)
    except:
        data['Product Title'].append("")

#find the prices
    try:
        price = tile.find('span', 'price price-display').text.strip()
        data['Price'].append(price)  
    except:
        data['Price'].append("")

#find the stars
    try:
        g_star = tile.find("div",{"class" : "stars stars-small tile-row"}).find('span','visuallyhidden').text.strip()
    data['Stars'].append(g_star)
except:
    data['Stars'].append("")

    try:
        dd_starring = tile.find('dd', {"class" : "media-details-multi-line media-details-artist-dd module"}).text.strip()
        data['Starring'].append(dd_starring)
    except:
        data['Starring'].append("")

    try:
        running_time = tile.find_all('dl',{"class" : "media-details dl-horizontal copy-mini"})
        for dd_run in running_time :
            running = dd_run.find_all('dd')[1:2]
            for run in running :
             #print run.text.strip()
                data['Running Time'].append(run.text.strip())
    except:
                data['Running Time'].append("")

    try:
        dd_format = tile.findAll('dd',{"class" :"media-details-multi-line"})[1:2]
        for formatt in dd_format:
        data['Format'].append(textOfFormat)
    except:
         data['Format'].append("")

    try:
        div_shipping =tile.find_all('div',{"data-offer-shipping-pass-eligible":"false"})
        data['Shipping'].append("")
    except:
        freeshipping = "Free Shipping"
    data['Shipping'].append(freeshipping)

df = pd.DataFrame(data)
df

我想访问

如果没有类名。如何访问它?

就像第11行有5个

导演字段和其他很少有
发布日期。

目前我正在使用 [2:1] 等访问它。但它不是灵活的,也不能正确填充我的表。

有什么功能可以做到这一点吗?

【问题讨论】:

  • 很难理解您的描述。您能否说明您要访问哪些字段? “跑步时间”还是“明星”?
  • 我想访问所有
    元素,但是当我填充表格时.. 因为 dl 和 dt 的顺序不统一放置在
    我在运行时获得演员姓名,有时在格式中获得演员姓名。
  • 我已将检查元素 html 代码添加为图像。所以
    127 分钟
    没有类名。所以我知道除了使用 id 和类名来访问它之外,我没有其他方法,我让代码只查看第 1 个和第 2 个
    元素.如果添加了导演的
    ,则运行时间的
    标签会下降,并且表中的数据会填充演员..

标签: python html pandas beautifulsoup dataframe


【解决方案1】:

用以下代替凝视和运行时间:

try:
    dd_starring = tile.find('dd', {"class" : "media-details-artist-dd"}).text.strip()
    data['Starring'].append(dd_starring)
except:
    data['Starring'].append("")

try:      
    running = tile.find('dt',{'class':'media-details-running-time'})
    running_time = running.find_next("dd")
    data['Running Time'].append(running_time.text)
except:
            data['Running Time'].append("")

这应该现在运行。似乎当您使用 BeautifulSoup 选择多个类时,它可能会感到困惑,因此您只需通过 css 类media-details-artist-dd 即可获得 Actor。对于运行时间,我采用了一个简单的技巧:)

编辑: 更改代码以查找运行时间的dd,然后获取下一个兄弟。之前的代码有一个多余的部分

现在应该可以工作了

【讨论】:

  • 我没工作。运行时间的所有行都是空的。我想检查
    是否存在,然后只在
    下面打印
    应该可以工作。
  • 我有一个额外的部分。不确定这是否导致了问题。它现在应该可以工作了
  • 很抱歉延迟回复。我的网络断了。是的。 find_next("dd") 工作 :) 谢谢
猜你喜欢
相关资源
最近更新 更多
热门标签