Извлечение элементов в пределах </h>, но без <h>из HTML - PullRequest
0 голосов
/ 15 ноября 2018

Я очистил веб-сайт, который предоставляет мне почтовые индексы Лиссабона. С BeautifulSoup я смог получить почтовые индексы в элементе класса. Однако сами почтовые индексы все еще находятся в других классах, и я пробовал много вещей, чтобы извлечь их все оттуда. Однако, кроме манипуляции со строками, я не мог заставить это работать. Я новичок в webscraping и HTML, так что извините, если этот вопрос очень простой ..

Это мой код:

from bs4 import BeautifulSoup as soup
from requests import get

url='https://worldpostalcode.com/portugal/lisboa/'
response = get(url)
print(response.text)
html_soup = soup(response.text,'lxml')
type(html_soup)
zip_codes=html_soup.find_all('div', {'class' : 'rightc'})

И это фрагмент результата, из которого я хотел бы только извлечь почтовые индексы ..

[<div class="rightc">1000-246<hr/> 1050-138<hr/> 1069-188<hr/> 1070-204<hr/> 1100-069<hr/> 1100-329<hr/> 1100-591<hr/> 1150-144<hr/> 1169-062<hr/> 1170-128<hr/> 1170-395<hr/> 1200-228<hr/> 1200-604<hr/> 1200-862<hr/> 1250-111<hr/> 1269-121<hr/> 1300-217<hr/> 1300-492<hr/> 1350-092<hr/> 1399-014<hr/> 1400-237<hr/> 1500-061<hr/> 1500-360<hr/> 1500-674<hr/> 1600-232<hr/> 1600-643<hr/> 1700-018<hr/> 1700-302<hr/> 1750-113<hr/> 1750-464<hr/> 1800-262<hr/> 1900-115<hr/> 1900-401<hr/> 1950-208<hr/> 1990-162<hr/> 1000-247<hr/> 1050-139<hr/> 1069-190<hr/> 1070-205<hr/> 1100-070<hr/> 1100-330</div>]

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Я бы предложил вам заменить все теги </hr> на некоторые delimiter (i.e., # or $ or ,) перед загрузкой ответа страницы в виде супа. Теперь, когда вы загрузите ее в суп, работа будет настолько простой, что вы можете извлечь почтовые индексы в виде списка, просто вызвав класс.

from bs4 import BeautifulSoup as soup
from requests import get

url='https://worldpostalcode.com/portugal/lisboa/'
response = get(url)
print(response.text.replace('<hr>', '#'))
html_soup = soup(response.text,'lxml')
type(html_soup)
zip_codes=html_soup.find_all('div', {'class' : 'rightc'})
zip_codes = zip_codes.text.split('#') 

Надеюсь, это поможет! Ура! * * 1006

P.S .: Ответ открыт для улучшений и комментариев.

0 голосов
/ 15 ноября 2018

Используйте регулярные выражения, чтобы получить коды

from bs4 import BeautifulSoup
import requests
import re

url = 'https://worldpostalcode.com/portugal/lisboa/'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
element = soup.select_one('.codelist .rightc')
codes = re.findall(r"\d{4}-\d{3}",element.text)

for code in codes:
    print(code)
0 голосов
/ 15 ноября 2018

Ваш результат zip_codes имеет тип bs4.element.ResultSet, который представляет собой набор bs4.element.Tag. Так что zip_codes[0] - это то, что вас интересует (первый найденный тег). Используйте метод .text для удаления тегов <hr>. Теперь у вас есть длинная строка почтовых индексов, разделенных пробелами. Каким-то образом вычеркните их из списка (два варианта ниже, первый вариант более питонический и более быстрый).

from bs4 import BeautifulSoup as soup
from requests import get

url = 'https://worldpostalcode.com/portugal/lisboa/'
response = get(url)
html_soup = soup(response.text,'lxml')
zip_codes = html_soup.find_all('div', {'class' : 'rightc'})

# option one
zips = zip_codes[0].text.split(' ')
print(zips[:8])

# option two (slower)
zips = []
for zc in zip_codes[0].childGenerator():
    zips.append(zc.extract().strip())
print(zips[:8])

Выход:

['1000-246', '1050-138', '1069-188', '1070-204', '1100-069', '1100-329', '1100-591', '1150-144']
['1000-246', '1050-138', '1069-188', '1070-204', '1100-069', '1100-329', '1100-591', '1150-144']
0 голосов
/ 15 ноября 2018
html_soup = BeautifulSoup(htmlcontent,'lxml')
type(html_soup)
zip_codes=html_soup.find_all('div', {'class' : 'rightc'})

print(zip_codes[0].text.split(' '))

Вы можете получить text и split.

о / п:

[u'1000-246', u'1050-138', u'1069-188', u'1070-204',.........]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...