Как очистить адрес (текст, разделенный запятыми) с помощью p tag — BeautifulSoup в python

#python #python-3.x #text #beautifulsoup #urllib

#python #python-3.x #текст #beautifulsoup #urllib

Вопрос:

Я пытаюсь соскрести адрес из приведенной ниже ссылки:

 https://www.yelp.com/biz/rollin-phatties-houston
 

Но я получаю только первое значение адреса (т. Е.: 1731 Westheimer Rd ) Из полного адреса, который разделяется запятой:

 1731 Westheimer Rd, Houston, TX 77098
 

Кто-нибудь может мне помочь с этим, пожалуйста, найдите мой код ниже:

 import bs4 as bs
import urllib.request as url

source = url.urlopen('https://www.yelp.com/biz/rollin-phatties-houston')
soup = bs.BeautifulSoup(source, 'html.parser')

mains = soup.find_all("div", {"class": "secondaryAttributes__09f24__3db5x arrange-unit__09f24__1gZC1 border-color--default__09f24__R1nRO"})
main = mains[0] #First item of mains

address = []
for main in mains:
    try:       
        address.append(main.address.find("p").text)
    except:
        address.append("")

print(address)
# 1731 Westheimer Rd
 

Я хочу получить результат из тега p, а ниже приведены две детали тега p:
Примечание: я хочу добавить адрес в список.

 <p class="lemon--p__373c0__3Qnnj text__373c0__2Kxyz text-color--subtle__373c0__3DZpi text-align--left__373c0__2XGa-">1731 Westheimer Rd, Houston, TX 77098</p>


<p class="lemon--p__373c0__3Qnnj text__373c0__2Kxyz text-color--normal__373c0__3xep9 text-align--left__373c0__2XGa- text-weight--semibold__373c0__2l0fe text-size--large__373c0__3t60B"><a class="lemon--a__373c0__IEZFH link__373c0__1G70M link-color--blue-dark__373c0__85-Nu link-size--inherit__373c0__1VFlE" href="/map/rollin-phatties-houston" target="" name="" rel="" role="link">Get Directions</a><p class="lemon--p__373c0__3Qnnj text__373c0__2Kxyz text-color--subtle__373c0__3DZpi text-align--left__373c0__2XGa-">1731 Westheimer Rd, Houston, TX 77098</p></p>
 

Для получения более подробной информации вы можете перейти по ссылке: https://www.yelp.com/biz/rollin-phatties-houston

Ответ №1:

Страница страницы загружается динамически, поэтому urllib.request не поддерживает ее. Тем не менее, данные доступны в формате JSON на странице, которые вы можете искать с помощью встроенного re модуля и извлекать их с помощью встроенного json модуля.

 import re
import json
import bs4 as bs
import urllib.request as url

source = url.urlopen("https://www.yelp.com/biz/rollin-phatties-houston")
soup = bs.BeautifulSoup(source, "html.parser")

data = soup.select_one(
    "#wrap > div.main-content-wrap.main-content-wrap--full > yelp-react-root > script"
).string

json_data = json.loads(re.search(r"({.*})", data).group(1))

print(json_data["bizDetailsPageProps"]["bizContactInfoProps"]["businessAddress"])
 

Вывод:

 1731 Westheimer Rd, Houston, TX 77098
 

Комментарии:

1. Спасибо за ваш ответ! На самом деле, я хочу добавить их в список. Но я не могу добавить их в список. Не могли бы вы помочь в этом: address = [] для main в mains: попробуйте: data = soup.select_one(«#wrap > div.main-content-wrap.main-content-wrap—full > yelp-react-root > script»).string json_data = json.loads(re.search(r»({.*})», data).group(1)) new_data = json_data[«bizDetailsPageProps»][«bizContactInfoProps»][«businessAddress»] адрес.добавить (new_data) кроме: address.append(«»)

2. @Goutam от меня mains пуст. Не уверен, как у вас это получилось, может быть, у вас опечатка в сообщении с именем класса?

3. Спасибо за ваш ответ. Пожалуйста, найдите ссылку на GitHub: github.com/goutamborthakur555 /… (Я на самом деле хочу, чтобы данные «business_address» должны состоять из всего адреса. Пожалуйста, помогите мне с этим.)

4. @Goutam Это совершенно новый вопрос. Если этот ответ решил вашу проблему, подумайте о том, чтобы пометить его как принятый. И подумайте о том, чтобы задать новый вопрос здесь, на SO.

5. Спасибо. Позвольте мне задать новый вопрос.