Как извлечь список текста тега привязки внутри класса и добавить каждый текст в другой список с помощью beautifulsoup?

#python-3.x #web-scraping #beautifulsoup

#python-3.x #очистка веб-страниц #beautifulsoup

Вопрос:

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

 from urllib.request import Request
from bs4 import BeautifulSoup

data = """<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x11">comment1</a>, 
<a href="/search/?searchtype=name1$amp; query=x21">comment2 </a>
</p>
<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x31">comment3</a>, 
<a href="/search/?searchtype=name1$amp; query=x41">comment4 </a>
</p>"""

soup = BeautifulSoup(data, "html.parser")
data1 = soup.find_all("p", {"class": "comments"})    

x1 = []
x2 = []
    
for data in data1:
     get_a = data.find_all("a")
     text = ""
     for i in get_a:
         text = i.text
         x1.append(text)
         x2.append(text)
print(x1)
print(x2)
  

Я получаю следующие результаты:

 ['comment1', 'comment2 ', 'comment3', 'comment4 ']
['comment1', 'comment2 ', 'comment3', 'comment4 ']
  

Но я хотел бы получить желаемый результат следующим образом:

 x1= ['comment1', 'comment3']
x2= ['comment2', 'comment4']
  

Заранее благодарю вас за помощь.

Ответ №1:

 soup = BeautifulSoup(data, "html.parser")
data1 = soup.find("p", {"class": "comments"}).find_all('a')   
data2 = soup.find_all("p", {"class": "comments"})[1].find_all('a')   

x1 = []
x2 = []

for data in data1:
    x1.append(data.text)
for data in data2:
    x2.append(data.text)

print(x1)
print(x2)
  

Вывод:

 ['comment1', 'comment2 ']
['comment3', 'comment4 ']
  

Ответ №2:

Вы можете создать список list, а затем добавить к нему данные.Преимущество этого метода в том, что он масштабируемый.

 from urllib.request import Request
from bs4 import BeautifulSoup

data = """<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x11">comment1</a>, 
<a href="/search/?searchtype=name1$amp; query=x21">comment2 </a>
</p>
<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x31">comment3</a>, 
<a href="/search/?searchtype=name1$amp; query=x41">comment4 </a>
</p>"""
soup = BeautifulSoup(data, "html.parser")
data1 = soup.find_all("p", {"class": "comments"})    

x = []
for data in data1:
    get_a = data.find_all("a")
    text = []
    for i in get_a:
        text.append(i.text)
    x.append(text)
  

Вывод

 [['comment1', 'comment2 '], ['comment3', 'comment4 ']]
  

Если вы хотите в виде 2 отдельных списков, вы можете сделать что-то вроде этого

 x1,x2 = x
print(x1,x2)

['comment1', 'comment2 '], ['comment3', 'comment4 ']
  

Ответ №3:

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

 from bs4 import BeautifulSoup

data = """<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x11">comment1</a>, 
<a href="/search/?searchtype=name1$amp; query=x21">comment2 </a>
</p>
<p  class="comments">
<a href="/search/?searchtype=name1$amp; query=x31">comment3</a>, 
<a href="/search/?searchtype=name1$amp; query=x41">comment4 </a>
</p>"""

soup = BeautifulSoup(data, "html.parser").find_all("a")


def chop(l: list, n: int = 2):
    return [l[i:i   n] for i in range(0, len(l), n)]


def get_comments(anchors: list):
    return [anchor.text for anchor in anchors]


for comments in chop(get_comments(soup)):
    print(comments)
  

Это дает:

 ['comment1', 'comment2 ']
['comment3', 'comment4 ']