我通过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>
€ 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]”等等。有办法吗?
答案 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("€\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>
€ 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()