所以我见过很多关于similair的问题,但是我找不到一个好的答案。所以我有一个这样的网页结构:
我想要的是获取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"})
我的意思是它只打印出来:[]
答案 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")