BeautifulSoup: как получить значения тега супа с текстом? и как перебрать список URL? - PullRequest
1 голос
/ 31 марта 2020

Я новичок в прекрасном супе / селене в python, я пытаюсь получить контакты / электронные письма из списка URL-адресов. 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>

Я пытаюсь l oop список URL-адресов, но я могу получить soup только из первого URL-адреса в списке.

Код написан:

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. Как выполнить итерацию l oop через список или URL-адреса у меня есть?
  2. Как отфильтровать электронную почту и контакт с soup html.
  3. Ожидаемый результат:

URL-адрес Контактный адрес электронной почты

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

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Что-то вроде этого должно сделать это. Я удалил все неявные ожидания (которые, между прочим, если вы хотите go этот маршрут, вы должны установить один раз, вверху вашего скрипта, когда вы устанавливаете 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 + контакт + электронная почта.

1 голос
/ 31 марта 2020

Поскольку @QHarr предложил использовать внешний l oop для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...