在BeautifulSoup中获取div中的div

时间:2016-10-23 20:19:26

标签: python beautifulsoup

所以我见过很多关于similair的问题,但是我找不到一个好的答案。所以我有一个这样的网页结构:

Structure

我想要的是获取Id,就像线程XXXXXXXXX一样。这是我的代码:

from bs4 import BeautifulSoup
import urllib.request

req = urllib.request.Request("http://boards.4chan.org/g/catalog", headers={'User-Agent' : "Magic Browser"})
soup = BeautifulSoup(urllib.request.urlopen(req), "html.parser")
data2 = soup.find_all("div", attrs={"id": "threads"})
print (data2)

打印出来:[<div id="threads"></div>]。好的,但我怎么做到下面的事情呢?

这不起作用:

data3 = soup.find_all("div", attrs={"class": "thread"})

我的意思是它只打印出来:[]

2 个答案:

答案 0 :(得分:0)

使用children属性:

data2[0].children

答案 1 :(得分:0)

内容是动态呈现的,[<div id="threads"></div>]显然没有子项,作为替代方法,您可以解析包含来自源的线程数据的 json

from bs4 import BeautifulSoup
import requests
import re
import json

# use pattern to pull the json
patt = re.compile("var catalog\s+=\s+(\{.*?\});")
soup = BeautifulSoup(requests.get("http://boards.4chan.org/g/catalog").content, "html.parser")

# find the correct script tag.
data2 = soup.find("script", text=re.compile("var catalog ="))
# convert to json.
threads_js = json.loads(patt.search(data2.text).group(1))

这会给你一个包含所有动态内容的词典,你想要的是 threads 键。发布的数据太多,但您需要的所有内容都应该在那里,它看起来像是:

 {u'57205979': {u'b': 69, u'sub': u'', u'author': u'Anonymous', u'i': 5, u'tn_w': 250, u'teaser': u'Gotta love that hanging.', u'r': 17, u'lr': {u'date': 1477253272, 

每个外键都是<div id="thread-57205959" class="thread">

中的数字部分

在旁注中,当您要查找单个标记时,您应该使用 find 并使用can传递关键字而无需使用attrs:

 data2 = soup.find("div", id="threads")