Python 如何提取所有医生的姓名
我想提取所有成员的姓名,但我只从第一页获取成员的姓名Python 如何提取所有医生的姓名,python,python-2.7,beautifulsoup,Python,Python 2.7,Beautifulsoup,我想提取所有成员的姓名,但我只从第一页获取成员的姓名 from bs4 import BeautifulSoup import requests r = requests.get('https://www.acoinsite.org/life-member') soup = BeautifulSoup(r.text,'lxml') for data in soup.find_all('p',class_='font_7'): print data.text 我期望从所有103页中输
from bs4 import BeautifulSoup
import requests
r = requests.get('https://www.acoinsite.org/life-member')
soup = BeautifulSoup(r.text,'lxml')
for data in soup.find_all('p',class_='font_7'):
print data.text
我期望从所有103页中输出成员名称。你知道怎么解决吗?这应该可以解决你的问题:
from bs4 import BeautifulSoup
import requests
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "DNT": "1", "Connection": "close", "Upgrade-Insecure-Requests": "1"}
r = requests.get('https://www.acoinsite.org/life-member',headers=headers)
soup = BeautifulSoup(r.content,'lxml')
print(soup)
for data in soup.findAll('p',class_='font_7'):
print(data.find('em',{"style":"font-style:normal;"}).text)
希望这对您有所帮助如果您查看源代码,您可以看到数据是json格式的,您可以找到正确的json,然后使用
json.loads()进行解析并对其进行迭代,请参见下面的代码
import requests,json
from bs4 import BeautifulSoup
req = requests.get('https://www.acoinsite.org/life-member')
soup = BeautifulSoup(req.content,'lxml')
jdata = str(soup.find_all('script')[9]).split('warmupData = ')[1].split('</script>')[0].strip()[:-1]
data = json.loads(jdata)
for item in data['wixapps']['appbuilder']['items']['BlankList_i34svvgq322'].values():
print('Name: {}\nAddress: {}\nPhone: {}\nEmail: {}\n---------------------'.format(
item['title'].encode('utf-8'),
item['i34t1kp5'].encode('utf-8'),
item['i34t40ov'].encode('utf-8'),
item['i34t4jot'].encode('utf-8')))
导入请求,json
从bs4导入BeautifulSoup
req=请求。获取('https://www.acoinsite.org/life-member')
汤=BeautifulSoup(所需内容,'lxml')
jdata=str(soup.find_all('script')[9]).split('warmupData=')[1]。split(“”)[0]。strip()[:-1]
data=json.loads(jdata)
对于数据['wixapps']['appbuilder']['items']['BlankList_i34svvgq322']中的项。值():
print('Name:{}\n地址:{}\n电话:{}\n邮箱:{}\n-----------------------------'格式(
项目['title']编码('utf-8'),
项目['i34t1kp5'].编码('utf-8'),
项目['i34t40ov'].编码('utf-8'),
项目['i34t4jot'].编码('utf-8'))
当需要从多个页面提取数据时,通常可以执行以下操作之一:
1)找出从一页转到另一页时使用的url模式,并迭代这些模式。不幸的是,这似乎不是一个选项,因为url在页面之间不会改变
2)如果页面是动态的,需要在从源html中提取数据之前首先呈现,或者只是模拟使用openig浏览器并单击元素(例如本例中单击►代码>,使用Selenium模拟打开页面。然后从第1页中提取数据,然后模拟单击下一页,从第2页中提取数据,并将第2页中的数据附加到第1页中存储的数据中,等等,等等,直到到达页面的末尾。这样做的缺点是,转到页面、到页面、到页面等都很耗时共103页
3)找到GET ot POST请求url以访问API,并按照QHarr的建议以json格式获取数据。这可能是最好的方法,但我找不到他/她提到的请求url,我找到了另一种方法
4)json数据有时在html源代码中。通过搜索
标记找到它,然后操纵字符串以拉出json结构,并使用json.loads()
读取该结构。当时最困难的部分是找到他们实际拥有您想要的所有数据的地方,但我在以下键下找到了它:['wixapps']['appbuilder']['items']['BlankList\u i34svvgq322']
。然后,您可以迭代这些项目以获得所需内容:
我下面的解决方案是选项4:
from bs4 import BeautifulSoup
import requests
import json
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "DNT": "1", "Connection": "close", "Upgrade-Insecure-Requests": "1"}
r = requests.get('https://www.acoinsite.org/life-member',headers=headers)
soup = BeautifulSoup(r.content,'html.parser')
scripts = soup.find_all('script')
for script in scripts:
if 'var warmupData = ' in script.text:
script_str = script.text
script_str = script_str.split('var warmupData = ')[1]
jsonStr = script_str.rsplit(';',1)[0]
jsonObj = json.loads(jsonStr)
for k, v in jsonObj['wixapps']['appbuilder']['items']['BlankList_i34svvgq322'].items():
print (v['title'])
输出
您可以自己打印姓名,但很快,我也会将其放入一个列表中,然后向您显示1030个姓名:
name_list = [ v['title'] for k, v in jsonObj['wixapps']['appbuilder']['items']['BlankList_i34svvgq322'].items() ]
print (len(name_list))
1030
值得一读:代码中没有循环来解释不同的页面。如果它只返回一个页面,这是因为您只查看过一个页面。您必须呈现所有页面,然后只有您可以提取所有信息,您可以使用selenium单击下一步按钮。查看网络选项卡,似乎有对此的POST请求,您可以使用这些请求获得包含信息的json响应。似乎有所有的名字。@QHarr,我似乎看不到/找不到。这是在网络下的什么地方?很好的回答和解释!谢谢@Maaz。这些都是我在过去几个月里学到的东西。我认为看到其他人的方法和解决问题的不同方法是有帮助的,因为这有助于看到实现同一目标的各种方法。然后,您开始了解每种方法在不同情况下是如何不同和/或更好。