如何使用Selenium和BeautifulSoup从元素中的多个textnode提取文本

时间:2019-04-12 21:29:04

标签: python selenium xpath beautifulsoup webdriverwait

我通过BeautifulSoup找到了一个元素,该元素(HTML)如下所示:

tapable

我需要在另一个纽约,另一个 Appartamento 和另一个 100.000的一个变量 Vendita Residenziale /200.000 (不是强标签)和最后一个 130/170

我可以提取span标签文本:

  <div class="ListingData">
    <span id="l_Contract" class="contract">Vendita Residenziale</span><br />
    New York<br />
    Appartamento<br />
    <strong>Prezzo:</strong>
    &euro; 100.000/200.000
    - <strong>Metri quadri:</strong>
    130/170
    </div>

但是我正在努力获取其他信息,我试图做到:

x = ele.find('span', attrs = {'class': 'contract'}).get_text()

但是这给了我所有的div内容,这还可以,但是我需要获取各个信息行,例如纽约的“ result [1]”,Appartamento的“ result [2]”等等。有办法吗?

5 个答案:

答案 0 :(得分:0)

我混合使用BeautifulSoup4和正则表达式,可以玩regex

a=bs4.BeautifulSoup(txt,'html.parser')
a.findAll(id="l_Contract")[0].text # Vendita Residenziale
p=re.compile("<br />").split(txt)
p[1] # "New York"
p[2] # "Appartamento"
re.compile("&euro;\s+([0-9.]+\/[0-9.]+)\s+-\s+<strong>").search(txt).group(1) #100.000/200.000

另一种方式就是这样做

a.findAll(class_="ListingData")[0].text
#Output
'\nVendita Residenziale\n    New York\n    Appartamento\nPrezzo:\n    € 100.000/200.000\n    - Metri quadri:\n    130/170\n    '

更容易解析。

答案 1 :(得分:0)

由于您想要的所有文本都在<div>标记中,因此似乎最简单的方法是获取<div>文本,并将换行符'\n'上的文本拆分为{{1 }}列表:

result

然后可以根据需要将其编入索引:

result = [e.strip() for e in ele.div.text.strip().split('\n')]

>>> result
[u'Vendita Residenziale', u'New York', u'Appartamento', u'Prezzo:', u'\u20ac 100.000/200.000', u'- Metri quadri:', u'130/170']

答案 2 :(得分:0)

您可以使用navigable string and .contents

from bs4 import BeautifulSoup, NavigableString

html = '''
<div class="ListingData">
    <span id="l_Contract" class="contract">Vendita Residenziale</span><br />
    New York<br />
    Appartamento<br />
    <strong>Prezzo:</strong>
    &euro; 100.000/200.000
    - <strong>Metri quadri:</strong>
    130/170
    </div>
'''

soup = bs(html, 'lxml')
item1 = soup.select_one('#l_Contract').text
items = soup.select_one('.ListingData').contents
results = []
for item in items:
    if isinstance(item, NavigableString) and item.strip():
        results.append(item.strip())

item2 = results[0]
item3 = results[1]
item4 = results[2]

print(item1, ',', item2, ',', item3, ',', item4)

答案 3 :(得分:0)

这里实际上不是bs4问题,您想要的其他数据不在span标记内,请根据字符串观察结果提取数据

sp=sp.find('div',id='onesiwant')
for div in sp:
    all=div.text.strip()
    #now you can split('\n') 
     html=str(div)
     get the stuff out of span
        now split by '<br>' tags

您询问如何使用bs4从标记之间的文本中获取数据,或者用\ n分隔,因此这里的bs4不是必需的,只需字符串操作

答案 4 :(得分:0)

Selenium本身可以提取所有必需的文本,并且您可以使用以下解决方案:

element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "div[@class='ListingData']")))
text_Vendita_Residenziale = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "div[@class='ListingData']/span[@class='contract' and contains(@id='Contract')]")))
text_NewYork = driver.execute_script('return arguments[0].childNodes[3].textContent;', element).strip()
text_Appartamento = driver.execute_script('return arguments[0].childNodes[5].textContent;', element).strip()
text_100_200 = driver.execute_script('return arguments[0].childNodes[8].textContent;', element).strip()
text_130_170 = driver.execute_script('return arguments[0].lastChild.textContent;', element).strip()