Выпуск Beautifulsoup в Python - PullRequest
       22

Выпуск Beautifulsoup в Python

0 голосов
/ 04 августа 2020

Я новичок в Python. Я хотел бы очистить эту информацию, такую ​​как имя, круг интересов, образование и профессиональная квалификация, род занятий, политическая принадлежность, адрес офиса, рабочий телефон и электронная почта с этого веб-сайта: https://www.legco.gov.hk/general/english/members/yr16-20/lky.htm

Однако я просто очищаю имя на этом сайте. Как я могу выполнить требования sh? Вот моя кодировка:

import requests
from bs4 import BeautifulSoup
r = requests.get("https://www.legco.gov.hk/general/chinese/members/yr16-20/biographies.htm")
soup = BeautifulSoup(r.text,'html.parser')
for anchor in soup.find_all('a'):
    href = anchor.get('href', '/')
    if href.startswith("lky"):
      href = "https://www.legco.gov.hk/general/english/members/yr16-20/" + href
      print(href)
      r2 = requests.get(href)
      #print(r2.text)
      detail_soup = BeautifulSoup(r2.text,'html.parser')
      name = detail_soup.find("h2")
      print(name.text.strip())
      break
print("End of loop")

Большое вам спасибо !!

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Обычная хорошая привычка при царапании - go от одного к другому. Прежде всего, вы открываете браузер и проверяете область, которую пытаетесь очистить.

Мы видим, что весь контент находится в теге <div id="_content_new_" class="members-word">. Так что сначала очистите это:

root_div = soup.find('div', {'class': '_content_new_'})

Затем мы хотим найти URL-адреса для каждого члена. При дальнейшем осмотре мы видим, что ссылки находятся в теге <div class="bio-member-info">

member_divs = root_div.findAll('div', {'class': 'bio-member-info'})

Теперь нам нужен атрибут href из тегов <a>.

links = [div.find('a')['href'] for div in member_divs]

Теперь все, что нам нужно сделать, это получить доступ к странице каждого участника индивидуально и очистить информацию.

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

  • все информации заключено в тег <div id="_content_" class="content_word">.
  • имя заключено в тег <h2>
  • округа заключена в первый <ul> тег
  • «Образование и профессиональная квалификация» заключены в тег второй <ul> и может быть несколько тегов <li>
  • и т. д.
# We need the full URLs
base_url = 'https://www.legco.gov.hk/general/chinese/members/yr16-20/'

# We get the members' pages first
urls = list(map(lambda href: base_url + href, links))

for url in urls:
    r = requests.get(url)                            # We request the HTML page
    soup = BeautifulSoup(r.text, 'html.parser')      # Apply BS
    main_div = soup.find('div', {'id': '_content_'}) # Get the container div 

    # Scrape each information needed
    name = soup.findAll('h2')[0].getText()
    constituency = soup.findAll('ul')[0].find('li').getText()  # We need the first <ul>
    education = soup.findAll('ul')[1].findAll('li')            # We need the second <ul>
    education = [li.getText() for li in education]

    # Continue for all the remaining info
    

Это должно очистить информацию для всех участников. Надеюсь, это помогло!

0 голосов
/ 04 августа 2020

Привет и добро пожаловать в stackoverflow.

Ваша ошибка заключалась в том, что вы не пытались получить определенные элементы с помощью

details.find_all

Поэтому, пожалуйста, проверьте мой код для справки и изучите документацию BeautfiulSoup для ваш прогресс.

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.legco.gov.hk/general/chinese/members/yr16-20/biographies.htm")
soup = BeautifulSoup(r.text,'html.parser')
for anchor in soup.find_all('a'):
    href = anchor.get('href', '/')
    if href.startswith("lky"):
      href = "https://www.legco.gov.hk/general/english/members/yr16-20/" + href
      print(href)
      r2 = requests.get(href)

      #get name
      detail_soup = BeautifulSoup(r2.text,'html.parser')
      name = detail_soup.find("h2")
      name = name.text.strip()
      print("Name:", name, "\n")

      #find headers
      strong = detail_soup.find_all('strong')
      heads = []
      for i in strong:
             heads.append(i.text.strip())
      print('Headers:\n',heads)

      #find header childs
      data_details = []
      details = detail_soup.find_all('li')
      for i in details:
          data_details.append(i.text.strip())
      print('\nDetails:\n', data_details)

      #table parsing
      div = detail_soup.find('div',{'id':'container'})
      table = div.find('table')
      data = []
      rows = table.find_all('tr')
      for row in rows:
          cols = row.find_all('td')
          cols = [ele.text.strip() for ele in cols]
          data.append([ele for ele in cols if ele])

      print("\nTable data:\n",data)

Вывод:

https://www.legco.gov.hk/general/english/members/yr16-20/lky.htm
Name: Hon Andrew LEUNG Kwan-yuen, GBS, JP

Headers:
 ['Constituency :', 
'Education and professional qualifications :',
 'Occupation :', 'Political affiliation :', 'Office address', ':', 'Office telephone', ':', 'Office fax', ':', 'E-mail', ':', 'Website', ':']

Details:
 ['Functional Constituency - Industrial (First)', 
'BSc (Hon), Leeds University', 'Fellow, Textiles Institute', 
'Fellow, Clothing and Footwear Institute',
 'Honorary Doctor of Business Administration, 
Coventry University, UK', 'Merchant', 'Business and Professionals Alliance for Hong Kong']

Table data:
 [['Office address', ':', 'Room 710,
 Legislative Council Complex,\r\n1 Legislative Council Road,
 Central, Hong Kong'], ['Office telephone', ':', '2537 1339'],
 ['Office fax', ':', '2697 8482'],
 ['E-mail', ':', 'andrewleunglegco@outlook.com'],
 ['Website', ':', '-']]
...