在美丽的汤中寻找和储存根的孩子

时间:2017-08-17 00:15:33

标签: python beautifulsoup parent-child children

我正在尝试从父<orgname>中查找并存储孩子<assignee>。到目前为止,我的代码遍历XML文档,已经获取了某些其他标记 - 我已经将其设置为:

for xml_string in separated_xml(infile): # Calls the output of the separated and read file to parse the data
    soup = BeautifulSoup(xml_string, "lxml")     # BeautifulSoup parses the data strings where the XML is converted to Unicode
    pub_ref = soup.findAll("publication-reference") # Beginning parsing at every instance of a publication

    lst = []  # Creating empty list to append into

    with open('./output.csv', 'ab') as f:
        writer = csv.writer(f, dialect = 'excel')

        for info in pub_ref:  # Looping over all instances of publication

# The final loop finds every instance of invention name, patent number, date, and country to print and append

            for inv_name, pat_num, date_num, country, city, state in zip(soup.findAll("invention-title"), soup.findAll("doc-number"), assign.find("orgname"), soup.findAll("date"), soup.findAll("country"), soup.findAll("city"), soup.findAll("state")):

                writer.writerow([inv_name.text, pat_num.text, org_name.text, date_num.text, country.text, city.text, state.text])

我已按顺序排列这个,以便每个发明名称和专利配对,并需要组织受让人名称。问题是,还有其他标签与律师和类似组织这样的组织相关联:

<agent sequence="01" rep-type="attorney">
<addressbook>
<orgname>Sawyer Law Group LLP</orgname>
<address>
<country>unknown</country>
</address>
</addressbook>
</agent>
</agents>
</parties>
<assignees>
<assignee>
<addressbook>
<orgname>International Business Machines Corporation</orgname>
<role>02</role>
<address>
<city>Armonk</city>
<state>NY</state>
<country>US</country>
</address>
</addressbook>
</assignee>
</assignees>

我只想要<assignee>标记下的orgname。我试过了:

assign = soup.findAll(“受让人”) org_name = assign.findAll(“orgname”)

但无济于事。它只是射击:

  

“ResultSet对象没有属性'%s'。你可能正在处理一个   像单个项目的项目列表。你有没有调用find_all()?   打算调用find()?“%key

     

AttributeError:ResultSet对象没有属性“find”。你是   可能会将项目列表视为单个项目。你打电话了吗?   find_all()当你打算调用find()?

如何添加这些标签并查找受理人标签下的所有orgname? 这似乎很简单,但我无法得到它。

提前致谢。

1 个答案:

答案 0 :(得分:3)

assign = soup.findAll("assignee")会返回列表,这就是为什么调用org_name = assign.findAll("orgname")失败,您必须通过{{1}的每个元素并称之为assign,但似乎每个.findAll("orgname")中只有一个<orgname>,因此无需使用{{1}而不是<assignee>。尝试使用.findAll使用列表理解来.find的每个元素:

.find

或者,要直接获取他们的文本,请检查assign中是否存在orgnames = [item.find("orgname") for item in assign]

<orgname>