Как извлечь все имена врачей - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу извлечь имена всех участников, но имена участников я получаю только с первой страницы.

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 страниц. Есть идеи как это исправить?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

При необходимости извлечения данных с нескольких страниц вы обычно можете выполнить 1 из следующих действий:

1) Определить шаблон URL, который используется при переходе от страницы к странице,и перебрать те.К сожалению, это не вариант, так как URL не меняется от страницы к странице.

2) Если страница является динамической и должна отображаться в первую очередь перед извлечением данных из исходного html или просто для имитации использования openig браузера и нажатия на элементы (например,в этом случае нажмите , используйте Selenium для симуляции открытия страницы, затем извлеките данные со страницы 1, затем симулируйте щелчок на следующей странице, извлеките данные со страницы 2 и добавьте данные со страницы 2 к тому, что вы сохранили.со страницы 1 и т. д. и т. д. и т. п. до тех пор, пока вы не дойдете до конца страниц. Недостатком этого является то, что переход на страницу, страницу, страницу занимает много времени, особенно для 103 страниц.

3) Найдите URL-адрес запроса GET ot POST для доступа к API и получения данных в формате json в соответствии с предложением QHarr.Вероятно, это лучший способ сделать это, но я не смог найти тот URL-адрес запроса, который он / она упомянул, и я смог найти другой путь.

4) jsonданные иногда находятся внутри исходного кода HTML.Найдите это, выполнив поиск по тегам <script>, затем манипулируйте строкой, чтобы извлечь структуру json, и используйте json.loads(), чтобы прочитать это. Самым сложным было найти, где у них есть все данные, которые вы хотите, но янашел его под ключами: ['wixapps']['appbuilder']['items']['BlankList_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
1 голос
/ 01 апреля 2019

если вы просматриваете источник, в котором вы видите данные в формате 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')))
0 голосов
/ 01 апреля 2019

Это должно решить вашу проблему:

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)

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...