2017-02-14 2 views
0

Я либо получаю сообщение об ошибке или ничего не разбираемый/записи с помощью следующего кода:Синтаксический HTML и записи в CSV, используя BeautifulSoup - AttributeError или HTML-разбираемый

soup = BeautifulSoup(browser.page_source, 'html.parser') 
userinfo = soup.find_all("div", attrs={"class": "fieldWrapper"}) 
rows = userinfo.find_all(attrs="value") 

with open('testfile1.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    writer.writerow(rows) 

строк = userinfo.find_all (ATTRS = «значение»)

AttributeError: объект «Resultset» не имеет атрибута «find_all»

Так что я пытался для цикла с печатью только, чтобы проверить это, но ничего не возвращает в то время как программа работает успешно:

userinfo = soup.find_all("div", attrs={"class": "fieldWrapper"}) 
for row in userinfo: 
    rows = row.find_all(attrs="value") 
    print(rows) 

Это html, который я пытаюсь проанализировать. Я пытаюсь вернуть текст из значения атрибутов:

<div class="controlHolder"> 
         <div id="usernameWrapper" class="fieldWrapper"> 
          <span class="styled">Username:</span> 
          <div class="theField"> 
           <input name="ctl00$cleanMainPlaceHolder$tbUsername" type="text" value="username" maxlength="16" id="ctl00_cleanMainPlaceHolder_tbUsername" disabled="disabled" tabindex="1" class="textbox longTextBox"> 
           <input type="hidden" name="ctl00$cleanMainPlaceHolder$hdnUserName" id="ctl00_cleanMainPlaceHolder_hdnUserName" value="AAubrey"> 
          </div> 
         </div> 
         <div id="fullNameWrapper" class="fieldWrapper"> 
          <span class="styled">Full Name:</span> 
          <div class="theField"> 
           <input name="ctl00$cleanMainPlaceHolder$tbFullName" type="text" value="Full Name" maxlength="50" id="ctl00_cleanMainPlaceHolder_tbFullName" tabindex="2" class="textbox longTextBox"> 
           <input type="hidden" name="ctl00$cleanMainPlaceHolder$hdnFullName" id="ctl00_cleanMainPlaceHolder_hdnFullName" value="Anthony Aubrey"> 
          </div> 
         </div> 
         <div id="emailWrapper" class="fieldWrapper"> 
          <span class="styled">Email:</span> 
          <div class="theField"> 
           <input name="ctl00$cleanMainPlaceHolder$tbEmail" type="text" value="[email protected]" maxlength="60" id="ctl00_cleanMainPlaceHolder_tbEmail" tabindex="3" class="textbox longTextBox"> 
           <input type="hidden" name="ctl00$cleanMainPlaceHolder$hdnEmail" id="ctl00_cleanMainPlaceHolder_hdnEmail" value="[email protected]"> 
           <span id="ctl00_cleanMainPlaceHolder_validateEmail" style="color:Red;display:none;">Invalid E-Mail</span> 
          </div> 
         </div> 
         <div id="commentWrapper" class="fieldWrapper"> 
          <span class="styled">Comment:</span> 
          <div class="theField"> 
           <textarea name="ctl00$cleanMainPlaceHolder$tbComment" rows="2" cols="20" id="ctl00_cleanMainPlaceHolder_tbComment" tabindex="4" class="textbox longTextBox"></textarea> 
           <input type="hidden" name="ctl00$cleanMainPlaceHolder$hdnComment" id="ctl00_cleanMainPlaceHolder_hdnComment"> 
          </div> 
         </div> 

ответ

1

Ваша первая ошибка связана с тем, что find_all возвращает ResultSet, который более или менее список: вам придется перебирать элементы userinfo и позвоните по телефону find_all.

Для вашей второй проблемы, я уверен, когда attrs передается строка, она ищет элементы с этой строкой в ​​качестве своего класса. Предоставленный вами html не содержит элементов с классом value, поэтому имеет смысл, что ничего не будет распечатано. Вы можете получить доступ к значению элемента с помощью .get('value')

Чтобы распечатать значение текстовых входов, следующий код должен работать. (Попробовать/за исключением только поэтому скрипт не вылетать, если входной текст не найден)

for field_wrapper in soup.find_all("div", attrs={"class": "fieldWrapper"}): 
    try: 
     print(field_wrapper.find("input", attrs={"type": "text"}).get('value')) 
    except: 
     continue 
+0

Я вижу, что вы имеете в виду, я попытался с помощью кода вы предоставили, но опять ничего не печатает. Я пытаюсь получить текст из value = "username" value = "Полное имя" value = "[email protected]", поскольку я пытаюсь извлечь текст из формы. – nvachhan

+0

Gotcha. Мой отредактированный ответ выше выводит ожидаемый результат, когда я инициализирую BeautifulSoup с исходным HTML-кодом, который вы предоставили. Если он по-прежнему ничего не выводит, его возможный «browser.page_source» - это не то, что вы ожидаете от него, или ваш парсер неправильно обрабатывает страницу. – lanceg

+0

Я пробовал новую версию, которую вы написали, и все еще ничего, я помещаю 'except: print ('no text found')' просто посмотреть, будет ли он печатать что-нибудь, но все равно ничего, это кажется странным, я думаю, что вы правы, возможно, что-то не так с источником страницы. Я использую селен, чтобы перейти к этому вопросу в коде без проблем. – nvachhan

Смежные вопросы