как извлечь имя свойства класса divs в python? [Дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

59
задан Barnabe 10 April 2010 в 07:53
поделиться

5 ответов

.findAll() возвращает список всех найденных элементов, поэтому:

inputTag = soup.findAll(attrs={"name" : "stainfo"})

inputTag - это список (возможно, содержащий только один элемент). В зависимости от того, что вы хотите, вы должны либо делать:

 output = inputTag[0]['value']

, либо использовать метод .find(), который возвращает только один (первый) найденный элемент:

 inputTag = soup.find(attrs={"name": "stainfo"})
 output = inputTag['value']
88
ответ дан Łukasz 23 August 2018 в 21:33
поделиться
  • 1
    Качественный товар! Благодарю. теперь у меня есть вопрос о разборе вывода, который я долго куча не-ASCII символов, но я задам это в отдельном вопросе. – Barnabe 10 April 2010 в 08:33
  • 2
    не следует обращаться к «значению» в соответствии с stackoverflow.com/questions/2616659/… . Что делает вышеуказанный код в этом случае? Я думал, что вам нужно будет получить доступ к значению, выполнив output = inputTag[0].contents – Seth 12 April 2010 в 00:31
  • 3
    @Seth - нет, потому что он ищет атрибут атрибута input-tag, а .contents возвращает текст, инкапсулированный тегом (& lt; span & gt; Я .contents & lt; / span & gt;) - (просто ответ теперь, потому что я пришлось дважды проверять, что происходит, что может помочь кому-то другому) – Dolan Antenucci 27 July 2011 в 01:33
  • 4
    отличный ответ. однако я бы использовал inputTag[0].get('value') вместо inputTag[0]['value'], чтобы предотвратить отсутствие указателя в случае, если тег не имеет атрибута значения – amphibient 16 November 2016 в 20:33

В Python 3.x просто используйте get(attr_name) для вашего объекта тега, который вы используете с помощью find_all:

xmlData = None

with open('conf//test1.xml', 'r') as xmlFile:
    xmlData = xmlFile.read()

xmlDecoded = xmlData

xmlSoup = BeautifulSoup(xmlData, 'html.parser')

repElemList = xmlSoup.find_all('repeatingelement')

for repElem in repElemList:
    print("Processing repElem...")
    repElemID = repElem.get('id')
    repElemName = repElem.get('name')

    print("Attribute id = %s" % repElemID)
    print("Attribute name = %s" % repElemName)

в отношении файла XML conf//test1.xml, который выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <singleElement>
        <subElementX>XYZ</subElementX>
    </singleElement>
    <repeatingElement id="11" name="Joe"/>
    <repeatingElement id="12" name="Mary"/>
</root>

печатает:

Processing repElem...
Attribute id = 11
Attribute name = Joe
Processing repElem...
Attribute id = 12
Attribute name = Mary
1
ответ дан amphibient 23 August 2018 в 21:33
поделиться

Я бы на самом деле предложил вам сэкономить время, чтобы предположить, что вы знаете, какие теги имеют эти атрибуты.

предположим, что тег xyz имеет этот attritube с именем «staininfo» ..

full_tag = soup.findAll("xyz")

И я не пойму, что full_tag - это список

for each_tag in full_tag:
    staininfo_attrb_value = each_tag["staininfo"]
    print staininfo_attrb_value

Таким образом, вы можете получить все значения attrb staininfo для всех тегов xyz

1
ответ дан Avijit 23 August 2018 в 21:33
поделиться

Если вы хотите получить несколько значений атрибутов из источника выше, вы можете использовать findAll и понимание списка, чтобы получить все, что вам нужно:

import urllib
f = urllib.urlopen("http://58.68.130.147")
s = f.read()
f.close()

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(s)

inputTags = soup.findAll(attrs={"name" : "stainfo"})
### You may be able to do findAll("input", attrs={"name" : "stainfo"})

output = [x["stainfo"] for x in inputTags]

print output
### This will print a list of the values.
4
ответ дан glglgl 23 August 2018 в 21:33
поделиться

вы также можете использовать это:

import requests
from bs4 import BeautifulSoup
import csv

url = "http://58.68.130.147/"
r = requests.get(url)
data = r.text

soup = BeautifulSoup(data, "html.parser")
get_details = soup.find_all("input", attrs={"name":"stainfo"})

for val in get_details:
    get_val = val["value"]
    print(get_val)
0
ответ дан Mr.Bones 23 August 2018 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: