Как скрести текст по определенной ссылке с BeautifulSoup? - PullRequest
2 голосов
/ 05 мая 2019

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

Вторую текстовую строку легко очистить, поскольку она включает в себя уникальный класс, на который я могу ориентироваться, поэтому я уже получил эту работу, но я не смог успешно очистить первый текст (с одним из двух конкретных ссылки).

Я нашел этот вопрос ( Найти конкретную ссылку с Beautifulsoup ) и попытался реализовать его варианты, но не смог заставить его работать.

Вот фрагмент кода HTML, который я пытаюсь очистить. Эта скороговорка повторяется неоднократно в течение каждой страницы, которую я очищаю:

<em>[<a href="forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19">女孩</a>]</em> <a href="thread-443414-1-1.html" onclick="atarget(this)" class="s xst">寻找2003年出生2004年失踪贵州省黔西南布依族苗族自治州贞丰县珉谷镇锅底冲  黄冬冬289179</a>

Две части, которые я пытаюсь очистить и затем сохранить вместе в списке, представляют собой две строки текста на китайском языке.

Первый из них, means, что означает «женщина», - это тот, который я не смог успешно очистить.

Этому всегда предшествует одна из этих двух ссылок: forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19 (женский) forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=15 (мужской)

Я проверил целую кучу разных вещей, включая такие как:

gender_containers = soup.find_all('a', href = 'forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19')

print(gender_containers.get_text())

Но из-за всего, что я пробовал, я получаю ошибки вроде:

ResultSet object has no attribute 'get_text'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

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

В конечном итоге я хочу, чтобы каждая страница была очищена так, чтобы две строки в этом коде (女孩 и 寻找2003年出生2004年失踪贵州省...)

<em>[<a href="forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19">女孩</a>]</em> <a href="thread-443414-1-1.html" onclick="atarget(this)" class="s xst">寻找2003年出生2004年失踪贵州省黔西南布依族苗族自治州贞丰县珉谷镇锅底冲  黄冬冬289179</a>

... очищаются как две отдельные переменные, так что я могу сохранить их как два элемента в списке, а затем перейти к следующему экземпляру этого кода, очистить эти два фрагмента текста и сохранить их как другой список и т. Д. Я строю список списка, в котором я хочу, чтобы каждая строка / вложенный список содержал две строки: пол (女孩 или 男孩), а затем более длинную строку, которая имеет гораздо больше вариаций.

(Но в настоящее время у меня есть рабочий код, который очищает и сохраняет его, я просто не смог заставить работать гендерную часть.)

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Звучит так, как будто вы можете использовать атрибут = значение css-селектор с $ заканчивается оператором

Если на странице может быть только одно вхождение

soup.select_one("[href$='typeid=19'], [href$='typeid=15']").text 

Предполагается, что эти typeid=19 или typeid=15 встречаются только в конце интересующих строк. "," Между двумя в селекторе должно совпадать с любым из них.

Вы можете дополнительно обработать возможность не присутствия следующим образом:

from bs4 import BeautifulSoup
html ='''<em>[<a href="forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19">女孩</a>]</em> <a href="thread-443414-1-1.html" onclick="atarget(this)" class="s xst">寻找2003年出生2004年失踪贵州省黔西南布依族苗族自治州贞丰县珉谷镇锅底冲  黄冬冬289179</a>'''
soup=BeautifulSoup(html,'html.parser')
gender = soup.select_one("[href$='typeid=19'], [href$='typeid=15']").text if soup.select_one("[href$='typeid=19'], [href$='typeid=15']") is not None else 'Not found'
print(gender)

Несколько значений:

genders = [item.text for item in soup.select_one("[href$='typeid=19'], [href$='typeid=15']")]
0 голосов
/ 05 мая 2019

Попробуйте следующий код.

from bs4 import BeautifulSoup
data='''<em>[<a href="forum.php?mod=forumdisplay&fid=191&amp;filter=typeid&amp;typeid=19">女孩</a>]</em> <a href="thread-443414-1-1.html" onclick="atarget(this)" class="s xst">寻找2003年出生2004年失踪贵州省黔西南布依族苗族自治州贞丰县珉谷镇锅底冲  黄冬冬289179</a>'''
soup=BeautifulSoup(data,'html.parser')
print(soup.select_one('em').text)

OutPut:

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