Проблемы с получением всех имен с веб-страницы с грязной разметкой - PullRequest
0 голосов
/ 30 мая 2018

Я написал скрипт для анализа всех названий мобильных магазинов на веб-странице.Когда я запускаю свой сценарий, я получаю очень мало из них.Как я могу получить все имена с той страницы, где фамилия на данный момент Parkway Mobile Home Park - Alabama?

ссылка на веб-страницу

Это то, что я пробовал до сих порс:

import requests
from bs4 import BeautifulSoup

url = "replace with above link"

r = requests.get(url)
soup = BeautifulSoup(r.text,"lxml")
items = soup.select_one("table tr")
name = '\n'.join([item.get_text(strip=True) for item in items.select("td p strong") if "alabama" in item.text.lower()])
print(name)

Вывод:

Roberts Trailer Park - Alabama
Cloverleaf Trailer Park - Alabama
Longview Mobile Home Park - Alabama

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Попробуйте использовать html.parser вместо lxml.Кроме того, вместо использования select_one('table tr'), попробуйте использовать find_all('strong').Вам также необходимо удалить лишние пробелы и возврат каретки.

Следующий код вернет ожидаемые (491) записи:

import re
import requests
from bs4 import BeautifulSoup

url = "http://www.chattelmortgage.net/Alabama_mobile_home_parks.html"

r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
items = soup.find_all('strong')
name = '\n'.join([re.sub('\s{2,}', ' ', re.sub('[\r\n]', '', item.text)).strip() for item in items if 'alabama' in item.text.lower()])
print(name)
0 голосов
/ 30 мая 2018

HTML-код страницы очень плохой, поэтому он довольно уродливый, но это работает:

import requests
from bs4 import BeautifulSoup

url = "http://www.chattelmortgage.net/Alabama_mobile_home_parks.html"

r = requests.get(url)
soup = BeautifulSoup(r.text,"html")
table = soup.find('table', attrs={'class':'tablebg, tableBorder'})
print([item.text.strip()  for item in table.find_all("strong") if "alabama" in item.text.lower()])
...