2016-04-27 5 views
1

У меня есть HTML-структуру, подобную этойPython: Как найти текст первого тега привязки с помощью BeautifulSoup

<p class="title"> 
    <a href="abc.com"> 
    Story 
    </a> 
    <span class="domain"> 
    <a href="xyz.com">comments</a> 
    </span> 
</p> 

Я хочу, чтобы извлечь текст первого тега привязки, то есть Story

Вот как я я с помощью Beautifulsoup для извлечения текста из тега привязки

soup = BeautifulSoup(html, 'html.parser') 
soup.prettify() 
for link in soup.find_all(class_='title'): 
     print link.findNext('a').text 

и выход:

Story 

Comments 

Но я хочу извлечь только текст первого якорного тега, то есть Story. Как это сделать, используя BeautifulSoup в python?

ответ

1

Вы можете просто получить доступ к первому a тег, делая

print link.a.text 

Чтобы лишить лишние пробелы

link.a.text.strip() 
0

Вы можете сделать это с помощью цепочки на find() вызовы и используя get_text() метод:

soup.find("p", class_="title").a.get_text(strip=True) 

, где .a эквивалентно .find("a") в BeautifulSoup.

Или с CSS selector:

soup.select_one("p.title > a").get_text(strip=True) 
+0

я получил эту ошибку AttributeError: объект «NoneType» не имеет атрибута «get_text» –

+0

@ShoaibAkhtar пор HTML отличается от того, что вы представили. – alecxe

0

Если вы хотите только текст первого якоря, то вам не нужно find с помощью класса.

Вы ничего не говорили о class="title".

In [9]: html = """ 
<p class="title"> 
    <a href="abc.com"> 
    Story 
    </a> 
    <span class="domain"> 
    <a href="xyz.com">comments</a> 
    </span> 
</p> 
""" 
In [10]: soup = BeautifulSoup(html, "html.parser") 
In [11]: soup.a.text.strip() 
Out[11]: u'Story' 
+0

Предположим, что над структурой html повторяется несколько раз, то как я могу найти первый тег привязки во всем теге, чей класс является «заголовком» –

+0

. Мой ответ всегда найдет самый первый тег привязки независимо от каких-либо классов. Если вы хотите, чтобы первый якорь внутри какого-либо элемента с классом, см. Другие ответы –

Смежные вопросы