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。这些都是我在过去几个月里学到的东西。我认为看到其他人的方法和解决问题的不同方法是有帮助的,因为这有助于看到实现同一目标的各种方法。然后,您开始了解每种方法在不同情况下是如何不同和/或更好。