использовать Beautifulsoup для контента в пандах Dataframe - PullRequest
0 голосов
/ 19 июня 2019

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

sample.csv:

id web-scraper-order html_content
0  15636             <div class="product-details detail-row"><div c...
1  15619             <div class="product-details detail-row"><div c...
2  15656             <div class="product-details detail-column"><di...

Желаемый результат:

id web-scraper-order html_content                        html_content2
0  15636             <div class="product-details detail-row"><div c... ['EF1744','Grey Three/Off White/Gold Metallic','$120','2019-06-22']
1  15619             <div class="product-details detail-row"><div c...['...','...','...','...']
2  15656             <div class="product-details detail-column"><di...['...','...','...','...']

содержание в html_content

<div class="product-details detail-row"><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Style</span></div><span> EF1744 </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Colorway</span></div><span> Grey Three/Off White/Gold Metallic </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Retail Price</span></div><span> $120 </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Release Date</span></div><span> 2019-06-22 </span></div></div>

Требуемый текст ниже для каждой строки:

['EF1744','Grey Three/Off White/Gold Metallic','$120','2019-06-22']

Я нашел похожий пост здесь но, похоже, не работает с моим, поскольку мне нужно указать столбец.

Очень высокомерно я это сделал, но не повезло ....

import numpy as np
import pandas as pd
import re
from bs4 import BeautifulSoup 

d = pd.read_csv("sample.csv") 
df = pd.DataFrame(d,columns=['web-scraper-order','html_content'])

soup = BeautifulSoup(df['html_content'],'xml')
style = [item.text.strip() for item in soup.find_all('div', class_='detail')]

1 Ответ

0 голосов
/ 19 июня 2019

Вы можете использовать селектор CSS .detail > span, что означает выделение всех тегов <span> непосредственно под любым тегом с классом detail:

data = '''<div class="product-details detail-row"><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Style</span></div><span> EF1744 </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Colorway</span></div><span> Grey Three/Off White/Gold Metallic </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Retail Price</span></div><span> $120 </span></div><div class="detail"><div class="pinfo-container"><span class="icon"></span><span class="title">Release Date</span></div><span> 2019-06-22 </span></div></div>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')
l = [span.text.strip() for span in soup.select('.detail > span')]

print(l)

Отпечатки:

['EF1744', 'Grey Three/Off White/Gold Metallic', '$120', '2019-06-22']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...