BeautifulSoup:如何获取标记值和文本?以及如何遍历URL列表?

2024-06-16 09:09:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉python中的beautiful soup/selenium,我正在尝试从URL列表中获取联系人/电子邮件。 网址:

listOfURLs=['https://oooo.com/Number=xxxxx', 'https://oooo.com/Number/yyyyyy', 'https://oooo.com/Number/zzzzzz']

我正在解析的HTML:

<div class="row classicdiv" id="renderContacInfo"> <div class="col-md-2" style="word-break: break-word;"> <h6>Contact</h6> <h5>Israa S</h5> </div> <div class="col-md-2" style="word-break: break-word;"> <h6>Email</h6> <h5>israa.s@xxxx.com <br/> </h5> </div> <div class="col-md-2" style="word-break: break-word;"> <h6>Alternate Email</h6> <h5></h5> </div> <div class="col-md-2"> <h6>Primary Phone</h6> <h5>1--1</h5> </div> <div class="col-md-2"> <h6>Alternate Phone</h6> <h5> </h5> </div> </div>

我试图循环url列表,但我只能从列表中的第一个url获取soup

编写的代码:

driver = webdriver.Chrome(chrome_driver_path)
driver.implicitly_wait(300) 
driver.maximize_window()
driver.get(url)
driver.implicitly_wait(30)
content=driver.page_source
soup=BeautifulSoup(content,'html.parser')
contact_text=soup.findAll("div",{"id":"renderContacInfo"})
output1=''
output2=''
print(contact_text)
time.sleep(100)

for tx in contact_text:
    time.sleep(100)
    output1+=tx.find(text="Email").findNext('h5').text
    output2+=tx.find(text="Contact").findNext('h5').text

我的问题:

  1. 如何在列表或URL中迭代循环
  2. 如何从soup html中筛选电子邮件和联系人
  3. 预期产出:

URL Contact Email

https://oooo.com/Number=xxxxx xxxxxxxx xxxx@xxx.com

https://oooo.com/Number=yyyyy yyyyyyyy yyyy@yyy.com


Tags: texthttpsdivcomnumberdrivercolmd
2条回答

正如@QHarr建议的,使用外部循环作为url。使用正则表达式re搜索文本

import re
listOfURLs=['https://oooo.com/Number=xxxxx', 'https://oooo.com/Number/yyyyyy', 'https://oooo.com/Number/zzzzzz']

for url in listOfURLs:
    driver = webdriver.Chrome(chrome_driver_path)
    driver.maximize_window()
    driver.get(url)
    driver.implicitly_wait(30)
    content = driver.page_source
    soup = BeautifulSoup(content, 'html.parser')
    print(url)
    print(soup.find('h6',text=re.compile("Contact")).find_next('h5').text)
    print(soup.find('h6',text=re.compile("Email")).find_next('h5').text)

像这样的东西应该可以。我删除了所有的隐式等待(顺便说一句,如果你想走这条路线,你应该在你的脚本顶部设置一次,当你恢复你的driver;而且它们很长!)

listOfURLs=['https://oooo.com/Number=xxxxx', 'https://oooo.com/Number/yyyyyy', 'https://oooo.com/Number/zzzzzz']
result=[]
for url in listOfURLs:
    driver.get(url)
    content = driver.page_source
    soup = BeautifulSoup(content, 'html.parser')
    contact_text = soup.findAll("div", {"id": "renderContacInfo"})

    for tx in contact_text:
        output1=tx.find(text="Contact").findNext('h5').text
        output2=tx.find(text="Email").findNext('h5').text
        output=f"{url} {output1} {output2}"
        result.append(output)

driver.quit()

result是一个列表,以url+联系人+电子邮件的形式包含所有收集的输出

相关问题 更多 >